Penguncian Numba Cuda tidak berakhir

Saya mencoba membuat tumpukan thread-safe sederhana di numba cuda, tetapi ketika saya mencoba menggunakan tumpukan, kodenya hang (mungkin dari loop while selama penguncian). Menjalankannya dengan satu utas berfungsi dengan baik dan mutex disetel kembali ke nol, tetapi dengan lebih dari satu utas, output tidak pernah diteruskan dengan mengatakan dikompilasi.

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 sumber
comment
Apakah Anda memiliki pertanyaan untuk ditanyakan?   -  person talonmies    schedule 24.06.2021
comment
Ini adalah perilaku yang diharapkan pada GPU pra-volta. Ada berbagai pertanyaan di tag cuda seperti ini, menjelaskan alasannya dan apa yang harus dilakukan. Berikut salah satu contohnya.   -  person Robert Crovella    schedule 24.06.2021