CUDA错误:标识符“;(全球/设备)“;未定义,没有合适的转换,

CUDA错误:标识符“;(全球/设备)“;未定义,没有合适的转换,,cuda,device,global,Cuda,Device,Global,我在做一个光子映射的项目。我对光线跟踪器部分进行了编码,它在CPU上成功运行。现在我在GPU上做同样的事情(通过ssh) 我得到以下错误 存在“浮动3”到“无效*” 存在“浮动3”到“无效*” 不允许使用设备/\u全局功能 gpuRayTracer.cu(90): error: identifier "GPUmul" is undefined gpuRayTracer.cu(95): error: calling a host function from a gpuRayTracer.cu(

我在做一个光子映射的项目。我对光线跟踪器部分进行了编码,它在CPU上成功运行。现在我在GPU上做同样的事情(通过ssh)

我得到以下错误

存在“浮动3”到“无效*”

存在“浮动3”到“无效*”

不允许使用设备/\u全局功能

gpuRayTracer.cu(90): error: identifier "GPUmul" is undefined

gpuRayTracer.cu(95): error: calling a host function from a
gpuRayTracer.cu(95): error: identifier "GPUadd" is undefined

gpuRayTracer.cu(192): error: calling a host function from a
15 errors detected in the compilation of
不允许使用设备/\u全局功能

gpuRayTracer.cu(90): error: identifier "GPUmul" is undefined

gpuRayTracer.cu(95): error: calling a host function from a
gpuRayTracer.cu(95): error: identifier "GPUadd" is undefined

gpuRayTracer.cu(192): error: calling a host function from a
15 errors detected in the compilation of
不允许使用设备/\u全局功能

gpuRayTracer.cu(90): error: identifier "GPUmul" is undefined

gpuRayTracer.cu(95): error: calling a host function from a
gpuRayTracer.cu(95): error: identifier "GPUadd" is undefined

gpuRayTracer.cu(192): error: calling a host function from a
15 errors detected in the compilation of
“/tmp/tmpxft_0000432c_u00000000-4_gpuRayTracer.cpp1.ii” . make:[gpuRayTracer.o]错误2

gpuRayTracer.cu 第44、53、55行(错误)标记在以下代码中

下面使用的Float3是一个包含3个浮点变量(x、y、z坐标)的结构

void场景::GPUrayTracer(){
对象*d_对象列表[OBJ_MAX];
GLubyte*d_像素;
int*d_宽度,*d_高度;
漂浮3*d_眼睛,*d_注视;
int*d_对象计数;
尺寸1=尺寸3;
size_t size2=sizeof(int);
size\u t size3=sizeof(GLubyte);
//尺寸4=尺寸(对象);
Cudamaloc(和d_眼,尺寸1);
Cudamaloc(和d_lookAt,尺寸1);
cudaMemcpy(d_eye,&this->eye,size1,cudamemcpyhostodevice);
cudaMemcpy(d_lookAt,&this->lookAt,size1,cudamemcpyhostodevice);
Cudamaloc(和d_objectCount,大小2);
cudaMemcpy(d_objectCount,&this->objectCount,size2,cudaMemcpyHostToDevice);
Cudamaloc(和d_宽度,尺寸2);
Cudamaloc(和d_高度,尺寸2);
cudaMemcpy(d_Width,&this->screenWidth,size2,cudamemcpyhostodevice);
cudaMemcpy(d_高度,&此->屏幕高度,尺寸2,cudaMemcpyHostToDevice);
Cudamaloc(和d_像素,大小3);
cudaMemcpy(d_像素,&this->pixels,size3,cudamemcpyhostodevice);
Cudamaloc((void**)和d_对象列表,
(sizeof(this->objectList));
cudaMemcpy(d_对象列表,
&此->对象列表,
sizeof(this->objectList),cudamemcpyhostodevice);
第44行:光线跟踪器(d_像素、d_宽度、d_高度、,
d_对象列表、d_眼睛、d_注视);
cudaMemcpy((this->objectList),&d_objectList,sizeof(this)-
>对象列表),cudaMemcpyDeviceToHost);
cudaMemcpy(这个->像素,&d_像素,大小3,cudaMemcpyDeviceToHost);
cudaMemcpy((int*)此->屏幕宽度和d_宽度,大小2,cudaMemcpyDeviceToHost);
cudaMemcpy((int*)此->屏幕高度和d_高度,尺寸2,cudaMemcpyDeviceToHost);
cudaMemcpy((int*)this->objectCount,&d_objectCount,size2,cudaMemcpyDeviceToHost);
库达梅姆比(
行:53(空*)此->眼,
(无效*)&d_眼,尺寸(d_眼),cudaMemcpyDeviceToHost);
行:55 cudaMemcpy(this->lookAt,(void*)&d_lookAt,sizeof(d_lookAt),cudaMemcpyDeviceToHost);
}
__全局无效光线跟踪器(无符号字符*out\u数据、常量int屏幕宽度、常量int屏幕高度、对象*objectList、Float3眼睛、Float3注视、int对象计数)
{
int x=blockDim.x*BLOCK_大小+threadIdx.x;
int y=块尺寸y*块尺寸+螺纹IDX.y;
[b] //代码在这里[/b]
}
__设备浮点数GPUffminf(浮点数a、浮点数b){
如果(ab)
返回a;
返回b;
}
__设备浮动GPUmag(浮动3 a){
浮动res;
res=a.x*a.x+a.y*a.y+a.z*a.z;
res=sqrt(res);
返回res;
}
__设备\uuuuuu3 gp非规范化(浮动3 a){
浮点数3;
浮动磁感应=磁感应(a);
如果(磁!=0){
magn=(浮动)1.0/magn;
res.x=a.x*磁感应;
res.y=a.y*磁感应;
res.z=a.z*磁感应;
返回res;
}
返回a;
}
__装置浮动3 GPUcross(浮动3 a,浮动3 b){
浮点数3;
res.x=a.y*b.z-a.z*b.y;
res.y=a.z*b.x-a.x*b.z;
res.z=a.x*b.y-a.y*b.x;
返回res;
}
__设备浮动GPUdot(浮动3 a、浮动3 b){
返回(浮动)(a.x*b.x+a.y*b.y+a.z*b.z);
}
__设备浮动3 GPUsub(浮动3 a,浮动3 b){
浮点数3;
res.x=a.x-b.x;
res.y=a.y-b.y;
res.z=a.z-b.z;
返回res;
}
__设备浮动3 GPUadd(浮动3 a、浮动3 b){
浮点数3;
res.x=a.x+b.x;
res.y=a.y+b.y;
res.z=a.z+b.z;
返回res;
}
__装置浮点数3 GPUmul(浮点数3 a、浮点数b){
浮点数3;
res.x=a.x*b;
res.y=a.y*b;
res.z=a.z*b;
返回res;
}
代码中有什么错误

除此之外,我还有几个问题

*编译.cu/.cpp文件的顺序..有关系吗?? *内核应该只从main.cpp调用吗?? *如果是,那么.cu文件是否应该只包含全局/设备功能??

好的,首先,你可以 .cu其他文件中的C/C++函数 而不是全局/设备功能。也不 编译的顺序是否重要

  • 对于此错误:没有合适的从“Float3”到 “void*”存在

    你需要做什么 (无效**)

  • 而不是

    (无效*)

    对于类似这样的错误:gpuRayTracer.cu(76):错误:标识符

    “GPUsub”未定义

    您需要定义GPUsub函数 在调用它的函数之前 .cu文件。只需移动函数 文件顶部的定义

    对于这样的错误:从设备/全局函数调用主机函数是不正确的 允许

    好的,你不能调用任何这样的函数 在CPU上执行(没有 设备全局标识符)从设备或全局功能

    以下是您需要做的事情,以使 生活很轻松

    在单独的.cu中定义每个函数 文件,并使用头文件 减速。你应该有一个主机 函数,该函数执行所有 管道,它可以调用gpu以及 cpu功能


    首先,在文件顶部为所有设备函数定义原型,如下所示:“\uuuu global\uuuu\void raytracer(unsigned char,int,int,Object*,Float3,Float3,int);”