【发布时间】:2015-02-26 07:44:56
【问题描述】:
我正在尝试实现一个执行并行缩减的内核。下面的代码有时会起作用,我无法确定为什么它在某些情况下会出错。
__kernel void summation(__global float* input, __global float* partialSum, __local float *localSum){
int local_id = get_local_id(0);
int workgroup_size = get_local_size(0);
localSum[local_id] = input[get_global_id(0)];
for(int step = workgroup_size/2; step>0; step/=2){
barrier(CLK_LOCAL_MEM_FENCE);
if(local_id < step){
localSum[local_id] += localSum[local_id + step];
}
}
if(local_id == 0){
partialSum[get_group_id(0)] = localSum[0];
}}
基本上,我是在对每个工作组的值求和并将每个工作组的总数存储到 partialSum 中,最后的求和是在主机上完成的。下面是设置总和值的代码。
size_t global[1];
size_t local[1];
const int DATA_SIZE = 15000;
float *input = NULL;
float *partialSum = NULL;
int count = DATA_SIZE;
local[0] = 2;
global[0] = count;
input = (float *)malloc(count * sizeof(float));
partialSum = (float *)malloc(global[0]/local[0] * sizeof(float));
int i;
for (i = 0; i < count; i++){
input[i] = (float)i+1;
}
我认为当输入的大小不是 2 的幂时它有什么关系?我注意到它开始出现在 8000 及以上的数字上。欢迎任何帮助。谢谢。
【问题讨论】:
标签: c parallel-processing opencl