Блокировка Numba Cuda не завершается

Я пытаюсь сделать простой потокобезопасный стек в 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())

person Kyle Sprague    schedule 24.06.2021    source источник
comment
У вас есть вопрос?   -  person talonmies    schedule 24.06.2021
comment
Это ожидаемое поведение на графических процессорах до volta. В теге cuda, подобно этому, есть различные вопросы, объясняющие, почему и что с этим делать. Вот один из примеров.   -  person Robert Crovella    schedule 24.06.2021