我有一个opencl内核,可以在两个循环中计算两个全局缓冲区。 第一个循环使用全局线程进行一些计算,并将结果写入输出缓冲区" OutBuff"。然后第二个循环更新全局缓冲区的值" UpdateBuff"根据" OutBuff"中计算的结果在第一个循环中(在上一个级别)。问题是,由于线程并行执行,因此两个循环之间的全局线程发生了变化。但在我的情况下,我需要保持这两个循环之间的线程执行顺序。我需要计算具有相同全局id的两个循环。 例如
__kernel void globalSynch(__global double4* input,__global uint *points,__global double4* OutBuff,__global double4* UpdateBuff)
{
int gid = get_global_id(0);
uint pt;
for(int level=0;level<N;level++)
{
for(int i=0;i<blocksize;i++)
{
pt== points[gid*i*level];
OutBuff[pt]= do_some_computations(UpdateBuff,....);
}
barrier( CLK_GLOBAL_MEM_FENCE);
for(int j=0;j<blocksize1;j++)
{
pt=points[gid*j*(level+1)];
UpdateBuff[pt]= do_some_computations(OutBuff,...);
}
barrier( CLK_GLOBAL_MEM_FENCE);
}
}
这与使用信号量有关吗?
答案 0 :(得分:0)
这是一个常见的OpenCL误解。 barrier
语句仅在工作组内,而不是全局工作大小。没有全局同步的声明(因为工作组的执行方式;有些甚至在其他人开始之前就完成了)。全局同步的解决方案是使用单独的内核。第一个将完成,然后第二个将完成。