0

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

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

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

4

1 回答 1

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);
}
于 2012-09-07T06:22:37.780 回答