用户
 找回密码
 立即注册
quanzhang100 该用户已被删除
发表于 2013-11-7 22:19:34
76392
while(iterSech<maxSech)
{
...               
kernel<<<dimGrid,dimBlock>>>(   ... ,step_d+iterSech,...);
...                       
}
step_d 是一个常量数组,在函数外面这样定义了step_d
__device__ double step_d[8]={0.5,0.25,0.125,0.06250,0.03125,0.015625,0.0078125,0.0039065};
但是编译出现这样的错误:expression must have integral or enum type
请问一下这是什么原因呢?

使用道具 举报 回复
发表于 2013-11-7 22:32:46
LZ您好:

__device__定义的数组/变量是device端的全局数组/变量,无需通过参数传递,直接在kernel中可以访问。您可以在kernel中通过下标来选择您需要的数据。

以及,此类数组/变量称为Symbol,有一些特殊处理。

如果您想使用kernel参数的方法访问,那么您需要使用API函数cudaGetSymbolAddress()来获得Symbol的实际地址,然后作为参数传递给kernel使用。

大致如此,供您参考。

感谢深夜来访,祝您编码舒心~
使用道具 举报 回复 支持 反对
发表于 2013-11-8 12:45:53
ice 发表于 2013-11-7 22:32
LZ您好:

__device__定义的数组/变量是device端的全局数组/变量,无需通过参数传递,直接在kernel中可以访 ...

这个ICE已说的很清楚了,但是看到楼主没有回应。应该是没有看懂,那么我再简单的解释下:

您的要求(__device__ []的初始化)是可以的。

但您的这个要求和您当前犯的错误无关。您这个问题不是因为初始化而报错的,而是您需要在kernel里直接使用该数组或者真不想改,您需要使用cudaGetSymbolAddress后,您再进行指针变换。

请您思考这点。
感谢来访。

使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册