2012-11-06 36 views
0

我試圖編寫一個OpenCL實現memchr,以幫助我瞭解OpenCL的工作方式。我打算做的是爲每個工作項分配一大塊內存進行搜索。然後,在每個工作項目中,它循環搜索該字符的塊。在OpenCL中提前退出

尤其是如果緩衝區很大,我不希望其他線程在發現事件後繼續搜索(假設任何給定緩衝區中只有一個字符出現)。

我卡在的是一個工作項目如何顯示,主機和其他線程,當它已經找到了字符?

謝謝,

回答

1

你可以做到這一點的一種方法是使用全局標誌變量。當你找到這個值的時候你自動將它設置爲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 
} 

這可能比只運行整個內核(除非你是做了很多工作,在每次迭代)增加更多的開銷。另外,如果每個線程只檢查數組中的單個值,則此方法將不起作用。每個線程必須有多個工作迭代。

最後,我已經看到寫入原子變量的實例不會立即提交,因此您需要檢查此代碼是否會在系統上死鎖,因爲寫入沒有提交。

+2

假設停止不需要是精確的,我可以跳過原子函數並非原子使用它們來節省開銷嗎? – tangrs

+4

嚴格來說,根據OpenCL規範,不能保證其他工作項目將不會在沒有某種同步點的情況下看到「停止」指標。但是,如果您嘗試設置並檢查__global變量而不是原子,您可能會發現它在您的設備上可靠和/或性能更高。 –