【问题标题】:OpenCL global_id starts count from 1 instead of 0. Xeon PhiOpenCL global_id 从 1 而不是 0 开始计数。至强融核
【发布时间】:2015-07-31 04:17:00
【问题描述】:

我是 OpenCL 的新手,最近我偶然发现了一些对我来说没有意义的东西。

我正在使用 Intel 驱动程序(在 linux 机器上工作)并且设备是 Xeon Phi 协处理器。

问题是当我给local_item_size作为参数时

clEnqueueNDRangeKernel(commandQueue,
                       forceKernel, 1, 
                       &localItemSize, &globalItemSize,
                       NULL, 0, NULL, &kernelDone); 

以及在内核中打印全局线程 id 时

int tid = get_global_id(0); 

线程 id 从 1 开始,而不是从 0。

当我没有描述我的 local_item_size 并以 NULL 作为参数时,它似乎从 0 开始正确计数。

目前我正在我的代码中通过从get_global_id(0) 的返回值中减去 1 来解决此问题,以使我的代码正常工作..

简短地说:当我说我的local_item_size 是什么时,tid 从 1 开始。当我给 NULL 时,它从 0 开始。

尺寸设置代码:

// Global item size 
if (n <= NUM_THREADS) { 
  globalItemSize = NUM_THREADS; 
  localItemSize = 16; 
} else if (n % NUM_THREADS != 0) { 
  globalItemSize = (n / NUM_THREADS + 1) * NUM_THREADS; 
} else { 
  globalItemSize = n; 
} 

// Local item size 
localItemSize = globalItemSize / NUM_THREADS;

【问题讨论】:

  • localItemSize/globalItemSize 的值是多少?您可能应该显示更多代码。
  • // Global item size if (n &lt;= NUM_THREADS) { globalItemSize = NUM_THREADS; localItemSize = 16; } else if (n % NUM_THREADS != 0) { globalItemSize = (n / NUM_THREADS + 1) * NUM_THREADS; } else { globalItemSize = n; } // Local item size localItemSize = globalItemSize / NUM_THREADS; NUM_THREADS 固定为 256。
  • 我已将代码添加到您的问题中。通常,当所有代码都在问题中并且格式正确时,它可以帮助我们帮助您。

标签: opencl


【解决方案1】:

The 4th parameter to clEnqueueNDRangeKernel is an array of the offsets,不是本地大小 - 这是第 6 个参数。你的电话应该是

clEnqueueNDRangeKernel(commandQueue,
                       forceKernel, 1, 
                       NULL, &globalItemSize,
                       &localItemSize, 0, NULL, &kernelDone);

这也是 ID 从 1 开始的原因 - 因为您请求的偏移量为 1!

【讨论】:

    【解决方案2】:

    您将工作组规模传递给了错误的参数。 clEnqueueNDRangeKernel 的第三个参数是全局工作偏移,这就是您的全局 ID 出现偏移的原因。工作组大小应该转到第六个参数:

    clEnqueueNDRangeKernel(commandQueue,
                           forceKernel, 1, NULL,
                           &globalItemSize, &localItemSize,
                           0, NULL, &kernelDone); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2021-03-19
      相关资源
      最近更新 更多