问题:这个函数/内核声明缺少什么来阻止它编译?
的信息:
__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'之前预期','或';'
所以现在我只是各种无知。它究竟在寻找什么?
答案 0 :(得分:1)
OpenCL是C的扩展,因此,如果使用任何扩展,C编译器将不会解析和编译它。
因此,由C编译器处理GalGenCL.cl.c文件是没有意义的,除非明确说明扩展 - 可能通过#define
来隐藏或删除它们。
似乎__kernel
修饰符在编译时存在问题。
使用什么命令行编译程序?