Parallel processing 关于OpenCL';s clEnqueueNDRangeKernel()

Parallel processing 关于OpenCL';s clEnqueueNDRangeKernel(),parallel-processing,opencl,Parallel Processing,Opencl,假设我有以下代码: size_t globalSize = 4294967295; // (2^(32))-1 clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, 0, 0, NULL, NULL); 这是否意味着我希望内核执行4294967295次,OpenCL将决定最有效的工作组大小?基本上是的,不过您可能需要注意以下几点: 请注意,&globalSize后面的参数是一个NULL指针,而不是整数值0,因为该参数声

假设我有以下代码:

size_t globalSize = 4294967295; // (2^(32))-1
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, 0, 0, NULL, NULL);

这是否意味着我希望内核执行4294967295次,OpenCL将决定最有效的工作组大小?

基本上是的,不过您可能需要注意以下几点:

  • 请注意,
    &globalSize
    后面的参数是一个
    NULL
    指针,而不是整数值0,因为该参数声明为“const size\u t*local\u work\u size”
  • 在所有情况下,它不一定是最有效的工作组规模;实现可能无法完全准确地预测这一点。但是,他们应该选择合适/合理的尺寸
  • 实现可能具有运行时限制,这可能导致内核执行过早中止,或者设备可能不支持抢占,从而可能导致系统冻结。因此,像这样庞大的工作规模可能并不理想

谢谢您的回复。您回答了我的问题。在奇数或基本全局工作大小的情况下,运行时可能无法运行有效的工作组大小。两次幂和/或64的倍数效果更好。您可以使用大于所需的全局大小,传入所需大小的参数,并向内核添加一个条件以跳过几个较大的。性能增益值得开销。