0

我有一个 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);
}
}

这与使用信号量有关吗?

4

1 回答 1

1

这是一个常见的 OpenCL 误解。该barrier声明仅在一个工作组内,而不是全局工作规模。没有关于全局同步的声明(因为工作组的执行方式;有些甚至在其他人开始之前运行完成)。全局同步的解决方案是使用单独的内核。第一个将运行到完成,然后第二个将运行。

于 2018-02-09T18:35:16.213 回答