我正在尝试为 OpenCL 编写互斥锁。这个想法是让每个单独的工作项都能够以原子方式进行。目前,我认为问题可能是当扭曲中的一个线程获得锁时线程扭曲无法继续进行。
下面是我当前的简单内核,用于对数字求和。“数字”是一个浮点数组作为输入。“sum”是结果的单元素数组,“semaphore”是保存信号量的单元素数组。我在很大程度上基于此处的示例。
void acquire(__global int* semaphore) {
int occupied;
do {
occupied = atom_xchg(semaphore, 1);
} while (occupied>0);
}
void release(__global int* semaphore) {
atom_xchg(semaphore, 0); //the previous value, which is returned, is ignored
}
__kernel void test_kernel(__global float* numbers, __global float* sum, __global int* semaphore) {
int i = get_global_id(0);
acquire(semaphore);
*sum += numbers[i];
release(semaphore);
}
我有效地调用内核,例如:
int numof_dimensions = 1;
size_t offset_global[1] = {0};
size_t size_global[1] = {4000}; //the length of the numbers array
size_t* size_local = NULL;
clEnqueueNDRangeKernel(command_queue, kernel, numof_dimensions,offset_global,size_global,size_local, 0,NULL, NULL);
如上,运行时显卡挂起,驱动自行重启。我怎样才能修复它,使它不会?