我有一个 opencl 内核,可以在两个循环中计算两个全局缓冲区。第一个循环使用全局线程进行一些计算并将结果写入输出缓冲区“OutBuff”。然后第二个循环根据第一个循环(上一级)“OutBuff”中计算的结果更新全局缓冲区“UpdateBuff”的值。问题是两个循环之间的全局线程发生了变化,因为线程是并行执行的。但就我而言,我需要保持这两个循环之间的线程执行顺序。我需要计算具有相同全局 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);
}
}
这与使用信号量有关吗?