我正在嘗試爲OpenCL編寫互斥鎖。這個想法是每個單獨的工作項目都能夠自動進行的。目前,我認爲這個問題可能是因爲warp中的一個線程獲取鎖定時線程扭曲無法繼續。基本OpenCL互斥鎖實現(當前掛起)
我現在的簡單內核,用於求和數字。 「數字」是一組浮點數作爲輸入。 「sum」是結果的一個元素數組,「semaphore」是用於存放信號量的一個元素數組。我根據示例here嚴重依據它。
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);
如上所述,運行時,顯卡掛起,司機重新啓動。我怎樣才能解決它,讓它不?
我知道GPU的工作方式。但是,使用一個本地大小(如示例代碼所做的那樣)完美地工作。我將此作爲證據,證明這樣做會爲每個線程扭曲一個線程(或者說,只保存一個線程的執行)。線程扭曲無法鎖定,因爲每個線程中只有一個線程在運行!引用的鏈接給出了另一個有趣的解決方法,但我認爲它最終以不太便攜的方式做同樣的事情。 – imallett