【发布时间】: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