0
我試圖編寫一個OpenCL實現memchr
,以幫助我瞭解OpenCL的工作方式。我打算做的是爲每個工作項分配一大塊內存進行搜索。然後,在每個工作項目中,它循環搜索該字符的塊。在OpenCL中提前退出
尤其是如果緩衝區很大,我不希望其他線程在發現事件後繼續搜索(假設任何給定緩衝區中只有一個字符出現)。
我卡在的是一個工作項目如何顯示,主機和其他線程,當它已經找到了字符?
謝謝,
我試圖編寫一個OpenCL實現memchr
,以幫助我瞭解OpenCL的工作方式。我打算做的是爲每個工作項分配一大塊內存進行搜索。然後,在每個工作項目中,它循環搜索該字符的塊。在OpenCL中提前退出
尤其是如果緩衝區很大,我不希望其他線程在發現事件後繼續搜索(假設任何給定緩衝區中只有一個字符出現)。
我卡在的是一個工作項目如何顯示,主機和其他線程,當它已經找到了字符?
謝謝,
你可以做到這一點的一種方法是使用全局標誌變量。當你找到這個值的時候你自動將它設置爲1,而其他線程在他們工作時會檢查這個值。
例如:
__kernel test(__global int* buffer, __global volatile int* flag)
{
int tid = get_global_id(0);
int sx = get_global_size(0);
int i = tid;
while(buffer[i] != 8) //Whatever value we're trying to find.
{
int stop = atomic_add(&flag, 0); //Read the atomic value
if(stop)
break;
i = i + sx;
}
atomic_xchg(&flag, 1); //Set the atomic value
}
這可能比只運行整個內核(除非你是做了很多工作,在每次迭代)增加更多的開銷。另外,如果每個線程只檢查數組中的單個值,則此方法將不起作用。每個線程必須有多個工作迭代。
最後,我已經看到寫入原子變量的實例不會立即提交,因此您需要檢查此代碼是否會在系統上死鎖,因爲寫入沒有提交。
假設停止不需要是精確的,我可以跳過原子函數並非原子使用它們來節省開銷嗎? – tangrs
嚴格來說,根據OpenCL規範,不能保證其他工作項目將不會在沒有某種同步點的情況下看到「停止」指標。但是,如果您嘗試設置並檢查__global變量而不是原子,您可能會發現它在您的設備上可靠和/或性能更高。 –