打开CL:一个本地组可以在多个计算单元中执行吗?

时间:2012-09-07 05:37:23

标签: parallel-processing opencl

我在CPU上运行OpenCL实验。我的内核中有一个循环,其中本地组中的所有线程在每次迭代的中间和每次迭代的结束时进行同步。我这样做的原因是因为在我看来,创建cl_mem对象和在每次迭代中将内核排入队列的开销大于并行化的好处。

为了同步目的,我向内核传递了一个等于全局工作大小的本地组大小。在我看来,内核是在一个CPU内核而不是在所有CPU内核上执行的。

一个本地组可以在多个计算单元中执行吗?如果没有,无论如何都要保持多个计算单元之间的同步?

1 个答案:

答案 0 :(得分:0)

您无法在执行期间同步不同的工作组。

计算单元通常是一组处理器,它们能够进行通信以同步其任务。 例如,Nvidia计算单元(流多处理器)有8个流处理器,只能同步在这个特定计算单元中运行的任务。

如果你确实有你提到的开销,我会首先找出答案:

同步如何工作以及简单地将多个内核排入队列的效率取决于您使用的系统。因此,CPU非常擅长处理许多不同的内核,因为您不必将它们转移到GPU内存或类似内核。

我建议你对它进行基准测试,OpenCL提供了强大的分析功能! 您必须使用CL_QUEUE_PROFILING_ENABLE初始化您的队列,之后您可以打印每个事件对象的分析信息,例如(我正在使用C ++ - Bindings):

std::vector<cl::Event> evts;
//[Create some event objects by enqueueing and executing kernels]
for (unsigned int i=0; i<evts.size(); i++) {
  evts[i].getProfilingInfo(CL_PROFILING_COMMAND_QUEUED, &param);
  printf("%u: %llu", i, param);
  evts[i].getProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, &param);
  printf(" %llu", param);
  evts[i].getProfilingInfo(CL_PROFILING_COMMAND_START, &param);
  printf(" %llu", param);
  evts[i].getProfilingInfo(CL_PROFILING_COMMAND_END, &param);
  printf(" %llu\n", param);
}