2016-01-20 98 views
0

我想在OpenCL中使用同步信號設置來確保只有一個線程可以進入關鍵內核部分。 下面是代碼,我到目前爲止:OpenCL - 同步和信號?

void sync(int barrierID) { 
    int ID = get_global_id(0); 
    barrier(CLK_GLOBAL_MEM_FENCE); 
    while (ID - barrierID != 0) { 
     barrier(CLK_GLOBAL_MEM_FENCE); 
    } 
} 

//critical part 

void signal(int threadCount, int barrierID) { 
    barrierID++; 
    barrier(CLK_GLOBAL_MEM_FENCE); 
    while (barrierID != threadCount) { 
     barrier(CLK_GLOBAL_MEM_FENCE); 
    } 
    barrierID = 0; 
} 

與經緯線程的量,即wnat訪問重要組成部分,barrierID是多少線程已經通過這部分櫃檯。

不幸的是,這段代碼在OpenCL中不起作用。

有誰知道,如何解決這段代碼?

回答

1

您正在將GPU計算視爲多線程計算,這是完全錯誤的方法。

原因是在GPU計算中所有的「線程」(實際上它們都是工作項目)在同一時間運行。工作項目不能進入區域,運行代碼,而其他人正在做其他事情。因此,在GPU中有任何類型的分支是一個可怕的想法,因爲它會減慢你的應用程序,使GPU運行所有分支,即使在這種情況下某些項目不輸入。

對於您的具體情況:

你得到一個僵局在你的內核,因爲你正在創建一個分支屏障。一個工作項目進入後,將等待所有其他人進入。如果這種情況從未發生過,那麼你就會陷入僵局。

檢查屏障命令:https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/barrier.html

如果屏障是一個條件語句中,那麼所有的工作項目必須如有工作項目進入條件語句並執行屏障進入條件。

+1

同意。與此相關的是,當你使用'障礙'時,你必須確保工作組中的所有工作項目都擊中了它。所以任何時候你有一個有條件的內容都是可疑的。 – Dithermaster

+0

我明白這一點,但我的問題是,我有一條關鍵線(約1千行),線程必須單獨輸入。 任何想法如何做到這一點? – 3DExtended

+1

不,沒有辦法全局同步內核中給定點的線程。你必須創建多個內核。 – DarkZeros