2016-01-20 101 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