【发布时间】:2017-04-12 09:45:50
【问题描述】:
我正在测试以下代码,以便在 OpenCL 2.0 中使用 work_groups 内置函数执行并行数组元素添加。 (inclusive_add 和 reduce_add 在这种情况下)
kernel void(global const float *input,
global float *sum,
local float *scratch)
{
uint local_id = get_local_id(0);
scratch[local_id] = work_group_inclusive_add(input[get_global_id(0)]);
if (local_id == get_local_size(0)-1)
sum[get_group_id(0)] = work_group_reduce_add(scratch[local_id]);
}
如果我使用从 0 到 15 的浮点数组进行测试,步长为 1,global_size = 16 和 local_size = 4,我期望结果为“6.0 22.0 38.0 54.0”,如果我选择我的 CPU,这工作正常作为一个设备。
但只要我选择 GPU 并运行相同的代码,我就会得到“0.0 4.0 8.0 12.0”(这只是每个工作组中第一个位置的元素)
我错过了什么吗?
我尝试做但没有影响的事情:
在“if”之前添加“barrier(CLK_LOCAL_MEM_FENCE)”
更改局部大小和/或数组大小/全局大小。
注意事项:
我使用 clEnqueueWriteBuffer 传递输入数组,然后使用 clEnqueueReadBuffer 读取总和
CPU:i5 6200u
GPU:英特尔核芯显卡 520
(是的,它们支持 OpenCL 2.0,我可以像在运行时构建程序时那样通过传递 -cl-std=CL2.0 的 ioc64 成功构建内核)
【问题讨论】: