Kernel 在OpenCL内核中传递输出
首先,我可以在内核中初始化一个数组,比如“float output[3]={0}” 第二,我想使用我从内核的一部分得到的结果,并在下一部分中使用它(在同一个内核中)。我只编写了给定的内核,所以我想在下一部分中使用output[id]和output1[id]的值来获得output2[id]和output3[id],但它给了我“程序生成失败” 假设输入[3]={1,2,3}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 *
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私有的
变量,因此每个工作项都有自己的独立版本,具有可能不同的值。非常感谢您的解释