ฉันกำลังพยายามสร้างสแต็กที่ปลอดภัยสำหรับเธรดอย่างง่ายใน 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())
cuda
เช่นนี้ เพื่ออธิบายว่าทำไมและควรทำอย่างไร นี่คือคือตัวอย่างหนึ่ง - person Robert Crovella   schedule 24.06.2021