【发布时间】: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=64和global_work_size=128,那么当一个线程得到id=121时会发生什么。输入数据集中没有 121th 元素。又会如何对待output[121]?
我是否需要声明 output[global_work_size] 而不是 output[set_size] 并用额外的随机 8 个数据值填充输入?我可以在不使用条件检查或屏障的情况下丢弃内核中的这 8 个额外结果吗?
请告知是否遗漏了什么。
【问题讨论】:
-
您可以简单地在内核的开头添加一个
if(id >= size ){return;}。另外,我认为 CL 不是处理数据的好方法,因为它很小且多变。 -
是的,之前已经解决了。但无论如何,谢谢。似乎在 GPU 上执行此实现时性能很慢。