Я пытаюсь сделать простой потокобезопасный стек в numba cuda, но когда я пытаюсь использовать стек, код зависает (предположительно, из-за цикла while во время блокировки). Запуск его с одним потоком работает нормально, и мьютекс возвращается к нулю, но с более чем одним потоком вывод никогда не передается, говоря, что он скомпилирован.
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
, подобно этому, есть различные вопросы, объясняющие, почему и что с этим делать. Вот один из примеров. - person Robert Crovella   schedule 24.06.2021