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())
cuda
seperti ini, menjelaskan alasannya dan apa yang harus dilakukan. Berikut salah satu contohnya. - person Robert Crovella   schedule 24.06.2021