OpenCL on Xcode错误:全局变量必须有一个常量地址空间限定符const char*KernelSource=\n"\

OpenCL on Xcode错误:全局变量必须有一个常量地址空间限定符const char*KernelSource=\n"\,opencl,Opencl,我试图用Xcode编译这段代码,但我得到了上面的错误 const char *KernelSource = "\n"\ "__kernel void pi( \n"\ "__global float* out, \n"\ "uint cntSteps \n"\ ") \n"\ "{

我试图用Xcode编译这段代码,但我得到了上面的错误

const char *KernelSource =   "\n"\
"__kernel void pi(           \n"\
"__global float* out, \n"\
"uint cntSteps        \n"\
")                                                          \n"\
"{                                                          \n"\
" const uint idThread = get_local_id(0);                  \n"\
" uint numprocs = get_global_size(0);                     \n"\
" const float local_num = (float)cntSteps / numprocs;     \n"\
"float step = 1.0 / cntSteps;                            \n"\
"float sum = 0.0;                                        \n"\
"float x;                                                \n"\
"int localmax = (idThread + 1) * local_num;              \n"\
"for(uint i = idThread * local_num; i < localmax; i++)   \n"\
"{                                                          \n"\
"x = step * (i + 0.5);                                \n"\
"sum = sum + 4.0 / (1.0 + x * x);                     \n"\
"}                                                       \n"\
"out[idThread] = sum * step;                             \n"\
"}                                                          \n";
const char*KernelSource=“\n”\
“\uu内核无效pi(\n”\
\u全局浮点*输出,\n\
“uint CNT步骤\n”\
“”\n“\
“{\n”\
“const uint idThread=get_local_id(0);\n”\
“uint numprocs=获取全局大小(0);\n”\
“const float local_num=(float)cntSteps/numprocs;\n”\
“浮动步长=1.0/cntSteps;\n”\
“浮点和=0.0;\n”\
“浮动x;\n”\
“int localmax=(idThread+1)*local_num;\n”\
“对于(uint i=idThread*local_num;i

知道这个内核有什么问题吗

以下是我解决问题的方法:

  • 创建一个内核文件,例如calc_pi.cl
  • //calc_pi.cl

    kernel void pi(global float* out, uint cntSteps) {
       const uint idThread = get_local_id(0);
       uint numprocs = get_global_size(0);
       const float local_num = (float)cntSteps / numprocs;
       float step = 1.0 / cntSteps;
       float sum = 0.0;
       float x;
       int localmax = (idThread + 1) * local_num;
       for(uint i = idThread * local_num; i < localmax; i++) {
          x = step * (i + 0.5);
          sum = sum + 4.0 / (1.0 + x * x);
       }
       out[idThread] = sum * step;
    }
    
    2. in main.cpp 
    // include all necessary headers and the above kernel e.g 
    #include "calc_pi.cl.h"
    //.. more includes 
    
    kernelvoidpi(全局浮点*out,uint步骤){
    const-uint-idThread=get\u-local\u-id(0);
    uint numprocs=获取全局大小(0);
    const float local_num=(float)cntSteps/numprocs;
    浮动步长=1.0/s步长;
    浮动总和=0.0;
    浮动x;
    int localmax=(idThread+1)*local_num;
    对于(uint i=idThread*local_num;i
  • 然后使用您的内核

  • 我希望这对开始在Xcode中使用OpenCL的人有所帮助。

    从错误消息中可以看出,字符串分配似乎没有被正确解析。错误消息缺少第一个反斜杠前的引号。这是一个输入错误还是Xcode的输出?如果是后者,请检查第一个报价。这不是一个偶然的“聪明的引语”,是吗?尝试用一个没有换行符(\n)或换行符反斜杠的单行内核替换所有内容,看看这是否有效,然后再添加内容,直到换行符断开为止(这样您就知道是什么断开了)。谢谢您的建议,但我解决了这个问题,创建了新的kenel文件,例如calc_pi.cl,没有任何新行和反斜杠,并通过main.cpp文件中的include“calc_pi.cl.h”将其包含在Xcode项目中。听起来,头应该在Xcode中的编译时生成。我犯的第一个错误是我把它作为calc_pi.cl而不是calu pi.cl.h