Kernel 在OpenCL内核中传递输出

Kernel 在OpenCL内核中传递输出,kernel,opencl,Kernel,Opencl,首先,我可以在内核中初始化一个数组,比如“float output[3]={0}” 第二,我想使用我从内核的一部分得到的结果,并在下一部分中使用它(在同一个内核中)。我只编写了给定的内核,所以我想在下一部分中使用output[id]和output1[id]的值来获得output2[id]和output3[id],但它给了我“程序生成失败” 假设输入[3]={1,2,3} const char *ProgramSource = "__kernel void add(__global float *

首先,我可以在内核中初始化一个数组,比如“float output[3]={0}”

第二,我想使用我从内核的一部分得到的结果,并在下一部分中使用它(在同一个内核中)。我只编写了给定的内核,所以我想在下一部分中使用output[id]output1[id]的值来获得output2[id]output3[id],但它给了我“程序生成失败”

假设输入[3]={1,2,3}

const char *ProgramSource =
"__kernel void add(__global float *inputA, __global float *inputB, __global 
float *inputC, __global float *output2, __global float *output3)\n"\
"{\n"\
"  size_t id = get_global_id(0);\n"\
"float a = 0.0f;\n"\
"float b = 0.0f;\n"\
"float output[3] = {0};\n"\
"float output1 [3] = {0};\n"\
"a = inputB[id] + inputC[id];\n"\
"b = inputA[id] + inputC[id];\n"\
"  output[id] = a;\n"\
"  output1[id] = b;\n"\
"float c = 0.0f;\n"\
"float d = 0.0f;\n"\
"c = inputB[id] + output[id]);\n"\
"d = inputA[id] + output1[id];\n"\
"  output2[id] = c;\n"\
"  output3[id] = d;\n"\
"}\n";
InputB[3]={1,2,3}

const char *ProgramSource =
"__kernel void add(__global float *inputA, __global float *inputB, __global 
float *inputC, __global float *output2, __global float *output3)\n"\
"{\n"\
"  size_t id = get_global_id(0);\n"\
"float a = 0.0f;\n"\
"float b = 0.0f;\n"\
"float output[3] = {0};\n"\
"float output1 [3] = {0};\n"\
"a = inputB[id] + inputC[id];\n"\
"b = inputA[id] + inputC[id];\n"\
"  output[id] = a;\n"\
"  output1[id] = b;\n"\
"float c = 0.0f;\n"\
"float d = 0.0f;\n"\
"c = inputB[id] + output[id]);\n"\
"d = inputA[id] + output1[id];\n"\
"  output2[id] = c;\n"\
"  output3[id] = d;\n"\
"}\n";
InputC[3]={1,2,3}

const char *ProgramSource =
"__kernel void add(__global float *inputA, __global float *inputB, __global 
float *inputC, __global float *output2, __global float *output3)\n"\
"{\n"\
"  size_t id = get_global_id(0);\n"\
"float a = 0.0f;\n"\
"float b = 0.0f;\n"\
"float output[3] = {0};\n"\
"float output1 [3] = {0};\n"\
"a = inputB[id] + inputC[id];\n"\
"b = inputA[id] + inputC[id];\n"\
"  output[id] = a;\n"\
"  output1[id] = b;\n"\
"float c = 0.0f;\n"\
"float d = 0.0f;\n"\
"c = inputB[id] + output[id]);\n"\
"d = inputA[id] + output1[id];\n"\
"  output2[id] = c;\n"\
"  output3[id] = d;\n"\
"}\n";

这一行有一个额外的括号:

"c = inputB[id] + output[id]);\n"\

如果OpenCL程序未能编译,您可以使用
CL\u程序构建日志
调用
clGetProgramBuildInfo
,以获取一条可读的错误消息。

您已经收到了问题的正确答案,但我觉得我应该指出,您使用
输出
/
输出1
数组的方式并不正确在OpenCL中有任何意义:
float输出[3]
在内核函数中这样声明默认为
\uu private
地址空间。这意味着每个工作项都有自己的私有版本的数组,并且看不到其他工作项的数组。您只使用了索引
id
,所以至少这只是浪费资源。此外,您不需要在e每行的nd-字符串文本自动连接。请您再解释一下,如果我想在内核中初始化一个数组,那么我应该怎么做。谢谢如果您需要一个(私有)数组,这确实是您的做法,但您只使用
output[id]
。因此如果
id=0
output[1]
输出[2]
未使用(但会消耗宝贵的寄存器空间),如果
id=1
output[0]
output[2]
未使用,等等。换句话说,不需要数组。事实上,
output[id]
a
具有相同的值,因此您只需重写
c=inputB[id]+output即可[id];
作为
c=inputB[id]+a
。请注意,
a
b
也是
uu私有的
变量,因此每个工作项都有自己的独立版本,具有可能不同的值。非常感谢您的解释