【问题标题】:Opencl: global thread synchronization between two loopsOpencl:两个循环之间的全局线程同步
【发布时间】:2018-07-20 06:24:49
【问题描述】:

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

这与使用信号量有关吗?

【问题讨论】:

    标签: multithreading opencl thread-synchronization opencl-c access-synchronization


    【解决方案1】:

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

    【讨论】:

    • 好吧,我尽量避免在 CPU 和 GPU 之间传输内存数据,那么,我可以在第一个循环之后使用更新内核作为函数调用吗?由于硬件规格,我使用 OpenCL 1.2。
    • 您可以从 CPU 转移到 GPU,然后运行多个内核,然后从 GPU 转移到 CPU。
    猜你喜欢
    • 2016-07-08
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多