【问题标题】:Discard computations for extra global work id's in OpenCL丢弃 OpenCL 中额外全局工作 ID 的计算
【发布时间】:2016-04-25 19:52:40
【问题描述】:

我是 OpenCL 的初学者,正在尝试使用 GPU 来并行处理数据集。这些数据集的大小从 10 到 10000 不等,并且为这些集合一一调用相同的内核。每次调用的问题大小等于“set_size” 内核代码包含:

int id = get_global_id(0);
result = Process dataset[id]
output[id] = result;

output 是一个全局数组,用来取回结果。

我有一个具有 6 个计算单元的 GPU,最大 local_group_size 为 256。为了公平分配工作项,我使用 local_group_size=64 并将全局工作大小设置为:

local_work_groups=set_size / local_group_size; 
if (set_size % local_work_size) != 0
   local_work_groups++;
global_work_size=local_work_groups*local_group_size;
....
....
clEnqueueNDRangeKernel(command_queue,kernel,1,NULL,&global_work_size,local_group_size,0,NULL,NULL);

只有一个维度用于本地和全局 NDRange。令人困惑的是,如果set_size=120 怎么办? 如果使用local_group_size=64global_work_size=128,那么当一个线程得到id=121时会发生什么。输入数据集中没有 121th 元素。又会如何对待output[121]

我是否需要声明 output[global_work_size] 而不是 output[set_size] 并用额外的随机 8 个数据值填充输入?我可以在不使用条件检查或屏障的情况下丢弃内核中的这 8 个额外结果吗? 请告知是否遗漏了什么。

【问题讨论】:

  • 您可以简单地在内核的开头添加一个if(id >= size ){return;}。另外,我认为 CL 不是处理数据的好方法,因为它很小且多变。
  • 是的,之前已经解决了。但无论如何,谢谢。似乎在 GPU 上执行此实现时性能很慢。

标签: c opencl gpu


【解决方案1】:

如果您使用的是 opencl >= 2.0,则传递 NULL 作为本地工作组大小将允许实现将工作组拆分为不统一的大小(即在不修改代码的情况下保持最佳性能)。这得到了英特尔和 AMD 的支持,但不支持英伟达。在opencl

如果您在 opencl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多