【问题标题】:opencl c file fails to compileopencl c文件无法编译
【发布时间】:2011-10-06 15:40:26
【问题描述】:

问题:这个函数/内核声明中缺少什么使其无法编译?


信息:

__kernel void square(
   __global float* input,
   __global float* output,
   const unsigned int count)
{
int i = get_global_id(0);
if(i < count)
    output[i] = input[i] * input[i];
}

上面的代码 sn-p 在我的显卡上编译。我已经让它工作了,但出于维护原因,我决定将代码从我的文件中的字符串移动到单独的文件并简单地读入,没有什么不寻常的。我认为,理论上,我应该能够编译这段代码,无论它是否运行,但至少在 gcc 和命令行中调试,然后在运行时使用我的 gpu。

但上面的代码只是给了我错误:

GalGenCL.cl.c:51:10:错误:在“void”之前需要“=”、“,”、“;”、“asm”或“attribute

这与我想使用的实际代码中的错误相同:

__kernel void force(__global float* Galaxy, const unsigned int count)
{
    int i = get_global_id(0);
    float x,y,z,d,force;
    int j;
    for(j = 0; j < starc; j++)
    {    
        if (j == i) continue;
        //find relative distance
        x = Galaxy[i][1] - Galaxy[j][1];
        y = Galaxy[i][2] - Galaxy[j][2];
        z = Galaxy[i][3] - Galaxy[j][3];
        d = x*x+y*y+z*z;
        if (d == 0) continue;
        force = ((0.00000066742799999999995)*Galaxy[i][0]*Galaxy[j][0])/(d);
        Galaxy[i][7] = (x*x)*force*(-1)/d;
        Galaxy[i][8] = (y*y)*force*(-1)/d;
        Galaxy[i][9] = (z*z)*force*(-1)/d;
    }//end for loop
}

所以我试着改成这个:

__kernel __attribute__((vec_type_hint(float))); 
void force(__global float* Galaxy, const unsigned int count)

得到了这个:

GalGenCL.cl.c:8:1:警告:数据定义没有类型或存储 类 GalGenCL.cl.c:8:39:错误:“float”之前的预期表达式 GalGenCL.cl.c:8:45: 错误:在“)”标记之前应为“,”或“;” GalGenCL.cl.c:9:21:错误:在“float”之前应为“)”

所以我又改了,把浮子拿出来了:

__kernel __attribute__((vec_type_hint())); 
void force(__global float* Galaxy, const unsigned int count)

这让它更快乐了一点:

GalGenCL.cl.c:8:1:警告:数据定义没有类型或存储类 GalGenCL.cl.c:8:1:警告:“vec_type_hint”属性指令被忽略 GalGenCL.cl.c:9:21:错误:在“float”之前应为“)”

但它仍然不接受函数头中的“float”,所以我得到了分号。然后它抱怨:

GalGenCL.cl.c:9:1: 错误:在“void”之前应为“,”或“;”

所以现在我只是一头雾水。它到底在寻找什么?

【问题讨论】:

    标签: compilation opencl


    【解决方案1】:

    OpenCL 是 C 的扩展,因此,如果使用 任何 扩展,C 编译器将不会解析和编译它。

    因此,让 C 编译器处理 GalGenCL.cl.c 文件是没有意义的,除非明确说明扩展名 - 可能通过 #define 隐藏或删除它们。

    看来__kernel 修饰符在编译中存在问题。

    正在使用什么命令行来编译您的程序?

    【讨论】:

    • gcc GalGenCL.cl.c -lOpenCL。我很害怕。但是如果我不能使用 gcc 来测试实际代码,我可以在我的外部文件中部分地制作代码,使其可以编译,然后在我的实际代码中解析 OpenCL 所需的位。不太理想,但“实际工作”远比不理想。有什么建议吗?
    • clcc.sourceforge.net(至少可以离线编译 OpenCL)和software.intel.com/en-us/articles/opencl-sdk Intels OpenCL 提供离线编译器software.intel.com/en-us/articles/… 和 CPU 上的 OpenCL 调试器。
    猜你喜欢
    • 2018-01-25
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多