【发布时间】:2019-01-07 17:17:47
【问题描述】:
首先我可以在内核中初始化一个数组,例如 "float output[3] = {0}"
其次,我想使用从内核的一部分获得的结果并在下一部分(在同一个内核中)使用它。我写给定内核只是为了举例,所以我想使用 输出的值[id] 和 output1[id] 在下一部分得到 output2[id] 和 output3[id] 但它给我“程序构建失败”
假设 InputA[3]={1, 2, 3}
输入B[3]={1, 2, 3}
输入C[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";
【问题讨论】:
-
您已经收到了对您的问题的正确答案,但我觉得我应该指出您使用
output/output1数组的方式在 OpenCL 中没有任何意义:float output[3]在内核函数中声明的默认为__private地址空间。这意味着每个工作项都有自己的私有版本的数组,并且看不到其他工作项的数组。您只使用索引id,所以至少这只是浪费资源。此外,您无需在每行末尾添加 \ - 字符串文字会自动连接。 -
您能否再解释一下,如果我想在内核中初始化一个数组,那么我应该怎么做。谢谢
-
如果您需要一个(私有)数组,这确实是您的做法,但您只使用
output[id]。因此,如果id = 0、output[1]和output[2]未使用(但会占用宝贵的寄存器空间),如果id = 1、output[0]和output[2]未使用等。换句话说,不需要数组.事实上,output[id]与a具有相同的值,因此您只需将c = inputB[id] + output[id];重写为c = inputB[id] + a。请注意,a和b也是__private变量,因此每个工作项都有自己独立的版本,可能具有不同的值。 -
非常感谢您的解释