opencl c文件无法编译

时间:2011-10-06 04:31:59

标签: compilation opencl

问题:这个函数/内核声明缺少什么来阻止它编译?


的信息:

__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];
}

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

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

  

GalGenCL.cl.c:51:10:错误:在'void'之前预期'=',',',';','asm'或'属性'

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

__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:警告:数据定义没有类型或存储   class GalGenCL.cl.c:8:39:错误:'float'之前的预期表达式   GalGenCL.cl.c:8:45:错误:预期','或';'''''令牌   GalGenCL.cl.c:9:21:错误:预期')'在'浮动'之前

所以我再次改变了,把浮出去了:

__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”,所以我得到了分号。然后它抱怨道:

  

GalGenCL.cl.c:9:1:错误:在'void'之前预期','或';'

所以现在我只是各种无知。它究竟在寻找什么?

1 个答案:

答案 0 :(得分:1)

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

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

似乎__kernel修饰符在编译时存在问题。

使用什么命令行编译程序?