我需要计算一对工作项变量的总和。对于我的用例,组大小为{8},我需要计算工作项对[0,1],[2,3],[4,5],[6,7]的总和。我在本地函数中执行此求和,由内核函数调用。
部分代码:
__local float localSum[8];
int lid = get_local_id(0);
localSum[lid] = var;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid % 2 == 0) {
localSum[lid] += localSum[lid+1];
// localSum[lid] = 0.f; //Incorrect implementation but works
}
在排队内核后使用上面的代码,它给出了CL_INVALID_PROGRAM_EXECUTABLE。我尝试使用clGetProgramBuildInfo进行调试,以确保内核编译正常。并且,我没有看到任何错误消息,只有几个关于未使用变量的警告。
如果我评论对和线和下面的取消注释行(这不是我想要的功能),它不会给出任何错误。
这段代码有什么问题吗?我唯一的猜测是我不应该在本地功能中这样做。对本地函数与内核代码无法做什么有任何限制?
答案 0 :(得分:0)
在设备端, __ local 地址空间中的内存只能在内核函数中分配,而不能在此处调用的任何其他设备函数中分配。 OpenCL Reference的相关摘录:
允许指向__local地址空间的指针作为参数 函数(包括内核函数)。分配的变量 内核函数中的__local地址空间必须出现在内核函数范围内。
但是,您可以在内核函数中分配变量,然后传递指针。例如:
kernel void test() {
__local float localSum[8];
calculate(localSum);
}
void calculate(__local float *localSum) {
size_t lid = get_local_id(0);
localSum[lid] = 0;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid % 2 == 0) {
localSum[lid] += localSum[lid+1];
localSum[lid] = 0.f; //Incorrect implementation but works
}
}