Ошибки CUDA: идентификатор "(global / device)" не определен, нет подходящего преобразования, - PullRequest
0 голосов
/ 20 февраля 2011

Я делаю проект по картированию фотонов. Я кодировал часть raytracer, и она успешно работала на процессоре. Теперь я делаю то же самое на GPU (через ssh).

я получаю следующие ошибки

    nvcc -c -lSDL -lGL -lGLU AntTweakBar.a gpuRayTracer.cu
gpuRayTracer.cu(44): error: identifier "raytracer" is undefined

gpuRayTracer.cu(53): error: no suitable conversion function from

"Float3" для "void *" существует

gpuRayTracer.cu(55): error: no suitable conversion function from

"Float3" для "void *" существует

gpuRayTracer.cu(76): error: identifier "GPUsub" is undefined

gpuRayTracer.cu(77): error: identifier "GPUnormalize" is undefined

gpuRayTracer.cu(78): error: identifier "GPUcross" is undefined

gpuRayTracer.cu(80): error: calling a host function from a

устройство / _ global _ функция запрещена

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

gpuRayTracer.cu(95): error: calling a host function from a

устройство / _ global _ функция не разрешена

gpuRayTracer.cu(95): error: identifier "GPUadd" is undefined

gpuRayTracer.cu(192): error: calling a host function from a

устройство / _ global _ функция не разрешена

15 errors detected in the compilation of

"/ TMP / tmpxft_0000432c_00000000-4_gpuRayTracer.cpp1.ii" , make: * [gpuRayTracer.o] Ошибка 2

gpuRayTracer.cu строки 44,53, 55 (ошибки) отмечены кодом ниже

Float3, используемый ниже, представляет собой структуру, содержащую 3 переменные типа float (координаты x, y, z)

void Scene::GPUrayTracer(){

Object *d_objectList[OBJ_MAX];
GLubyte         * d_pixels;
int *d_Width, *d_Height;
Float3 *d_eye,*d_lookAt;
int *d_objectCount;
size_t size1=sizeof(Float3);
size_t size2=sizeof(int);
size_t size3=sizeof(GLubyte);
//size_t size4=sizeof(Object);

cudaMalloc(&d_eye,size1);
cudaMalloc(&d_lookAt,size1);
cudaMemcpy(d_eye,&this->eye,size1,cudaMemcpyHostToDevice);

cudaMemcpy(d_lookAt,&this->lookAt,size1,cudaMemcpyHostToDevice);


cudaMalloc(&d_objectCount,size2);
cudaMemcpy(d_objectCount,&this->objectCount,size2,cudaMemcpyHostToDevice);



cudaMalloc(&d_Width,size2);
cudaMalloc(&d_Height,size2);
cudaMemcpy(d_Width,&this->screenWidth,size2,cudaMemcpyHostToDevice);

cudaMemcpy(d_Height,&this->screenHeight,size2,cudaMemcpyHostToDevice);


cudaMalloc(&d_pixels,size3);
cudaMemcpy(d_pixels,&this->pixels,size3,cudaMemcpyHostToDevice);


cudaMalloc((void **)&d_objectList,
(sizeof(this->objectList)));
cudaMemcpy(d_objectList,
&this->objectList,
sizeof(this->objectList),cudaMemcpyHostToDevice);

line 44:raytracer<<<1,500>>>(d_pixels,d_Width,d_Height,
d_objectList,d_eye,d_lookAt);

cudaMemcpy((this->objectList),&d_objectList,sizeof(this-
>objectList),cudaMemcpyDeviceToHost);
cudaMemcpy(this->pixels,&d_pixels,size3,cudaMemcpyDeviceToHost);


cudaMemcpy((int *)this->screenWidth,&d_Width,size2,cudaMemcpyDeviceToHost);

cudaMemcpy((int *)this->screenHeight,&d_Height,size2,cudaMemcpyDeviceToHost);

cudaMemcpy((int *)this->objectCount,&d_objectCount,size2,cudaMemcpyDeviceToHost);

cudaMemcpy(


line:53   (void *)this->eye,
(void *)&d_eye,sizeof(d_eye),cudaMemcpyDeviceToHost);
line:55  cudaMemcpy(this->lookAt,(void *)&d_lookAt,sizeof(d_lookAt),cudaMemcpyDeviceToHost);


}



__global__ void raytracer( unsigned char *out_data,const int screenWidth,const int screenHeight,Object * objectList,Float3 eye,Float3 lookAt,int objectCount)
{
int x = blockDim.x * BLOCK_SIZE + threadIdx.x;
        int y = blockDim.y * BLOCK_SIZE + threadIdx.y;

        [b]//code goes here[/b]
}

__device__ float GPUffminf(float a, float b){



if(a<b)
        return a;

return b;


}



__device__ float GPUffmaxf(float a, float b){


        if(a>b)

        return a;

return b;

}





__device__ float GPUmag(Float3 a){

float res;

res=a.x*a.x+a.y*a.y+a.z*a.z;

res=sqrt(res);

return res;

}



__device__ Float3 GPUnormalize(Float3 a){

Float3 res;

float magn=mag(a);

if(magn!=0){

magn=(float)1.0/magn;

res.x=a.x*magn;

res.y=a.y*magn;

res.z=a.z*magn;

return res;

}

return a;



}

__device__ Float3 GPUcross(Float3 a ,Float3 b){

Float3 res;

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;

return res;

}

__device__  float GPUdot(Float3 a,Float3 b){

return (float)(a.x*b.x + a.y*b.y + a.z*b.z);

}



__device__  Float3 GPUsub(Float3 a,Float3 b){

Float3 res;

res.x=a.x-b.x;

res.y=a.y-b.y;

res.z=a.z-b.z;

return res;

}

__device__ Float3 GPUadd(Float3 a,Float3 b){

Float3 res;

res.x=a.x+b.x;

res.y=a.y+b.y;

res.z=a.z+b.z;

return res;

}





__device__ Float3 GPUmul(Float3 a,float b){

Float3 res;

res.x=a.x*b;

res.y=a.y*b;

res.z=a.z*b;

return res;

}

что неправильно в коде ??

кроме этого у меня есть несколько вопросов

* Порядок, в котором файлы .cu / .cpp компилируются ... это имеет значение ?? * Должно ли ядро ​​вызываться только из main.cpp ?? * Если так, должен ли файл .cu состоять только из глобальных функций / функций устройства ??

1 Ответ

1 голос
/ 25 февраля 2011

Хорошо, во-первых, вы можете поставить любой Функция C / C ++ в .cu файлах других чем глобальные функции / функции устройства. ни имеет значение порядок компиляции.

  1. Для этой ошибки: нет подходящей функции преобразования из «Float3» в "void *" существует

    тебе нужно сделать (Аннулируются **)

вместо

(пустота *)

Для таких ошибок: gpuRayTracer.cu (76): ошибка: идентификатор

"GPUsub" не определено

вам нужно определить функцию GPUsub перед функциями, которые вызывают его в Файл .cu. Просто переместите функцию определение в верхней части файла.

Для таких ошибок: вызов функции хоста из устройства / global функция не разрешено

хорошо, вы не можете вызвать любую функцию, которая выполняется на процессоре (не имеет устройство или (глобальный идентификатор в нем) из устройства или глобальной функции.

Вот что вам нужно сделать, чтобы сделать жизнь легка.

Определить каждую функцию в отдельном .cu файл и использовать заголовочный файл для их замедления. У вас должен быть один ХОСТ функция, которая выполняет все конвейер, он может вызвать как GPU, так и Функции процессора.

...