การล็อค Numba Cuda ไม่สิ้นสุด

ฉันกำลังพยายามสร้างสแต็กที่ปลอดภัยสำหรับเธรดอย่างง่ายใน numba cuda แต่เมื่อฉันพยายามใช้สแต็กโค้ดแฮงค์ (สันนิษฐานว่ามาจากลูป while ระหว่างการล็อค) การรันด้วยเธรดเดียวทำงานได้ดีและ mutex จะถูกตั้งค่ากลับเป็นศูนย์ แต่หากมีมากกว่าหนึ่งเธรด เอาต์พุตจะไม่ถูกส่งผ่านโดยบอกว่าคอมไพล์แล้ว

from numba import cuda
import numpy as np
@cuda.jit(device=True)
def push(mutex, stack,val):
    #lock using mutex
    while cuda.atomic.compare_and_swap(mutex, 0, 1)!=0:
        pass
    size=stack[0]
    size+=1
    stack[-size]=val
    stack[0]=size
    #unlock using mutex
    cuda.atomic.compare_and_swap(mutex, 1, 0)


@cuda.jit(device=True)
def pop(mutex, stack):
    #lock using mutex
    while cuda.atomic.compare_and_swap(mutex, 0, 1)!=0:
        pass
    size=stack[0]
    val = stack[-size]
    size-=1
    stack[0]=size
    #unlock using mutex
    cuda.atomic.compare_and_swap(mutex, 1, 0)
    return val

@cuda.jit
def mingle(array,stack,mutex):
    x = cuda.threadIdx.x
    push(mutex,stack,array[x])
    array[x] = pop(mutex,stack)
    
    
array=cuda.to_device(np.arange(32))
print(array.copy_to_host())
stack=cuda.to_device(np.zeros([40],dtype=np.int64))
mutex=cuda.to_device(np.array([0],dtype=np.int64))
mingle[1,1](array,stack,mutex)
print("compiled")
mingle[1,32](array,stack,mutex)
print(array.copy_to_host())

person Kyle Sprague    schedule 24.06.2021    source แหล่งที่มา
comment
คุณมีคำถามที่จะถามหรือไม่?   -  person talonmies    schedule 24.06.2021
comment
นี่เป็นลักษณะการทำงานที่คาดไว้บน GPU รุ่นก่อนแรงดันไฟฟ้า มีคำถามมากมายบนแท็ก cuda เช่นนี้ เพื่ออธิบายว่าทำไมและควรทำอย่างไร นี่คือคือตัวอย่างหนึ่ง   -  person Robert Crovella    schedule 24.06.2021