【问题标题】:Passing output within the kernel in OpenCL在 OpenCL 的内核中传递输出
【发布时间】: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 = 0output[1]output[2] 未使用(但会占用宝贵的寄存器空间),如果id = 1output[0]output[2] 未使用等。换句话说,不需要数组.事实上,output[id]a 具有相同的值,因此您只需将c = inputB[id] + output[id]; 重写为c = inputB[id] + a。请注意,ab 也是 __private 变量,因此每个工作项都有自己独立的版本,可能具有不同的值。
  • 非常感谢您的解释

标签: kernel opencl


【解决方案1】:

你在这一行多了一个括号:

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

如果您的 OpenCL 程序编译失败,您可以调用 clGetProgramBuildInfoCL_PROGRAM_BUILD_LOG 以获取人类可读的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2017-03-08
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多