2012-02-18 2 views
2

나는 C로 큰 프로젝트를 가지고 있으며 그 안에 Cuda 커널을 통합하려고합니다. 나는 "gcc -c main.c"와 ".cu"파일을 "nvcc -c cuda_GMRES.cu"파일로 컴파일하고 nvcc : "nvcc -o main"파일과 2 개의 오브젝트 파일을 연결하려고한다. o cuda_GMRES.o "다음과 같은 오류 메시지가 나타납니다 :Cuda mixed C 프로젝트 링크

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o : 함수에서 _start': (.text+0x20): undefined reference to 주 ' collect2 : 신분증 그것은 내가 C 파일과 CUDA를 결합하기 위해 노력하고있어 처음 나는 누군가가 나를 도와 줘요 wrong.Can 짓을했을 수도 1 개 종료 상태

를 반환했습니다. 나는 Rock OS가있는 GPU 클러스터에있다.

내 main.c를 파일 :

#include <stdio.h> 
#include <math.h> 
#include "cuda_wrapper.h" //header containing wrapper function 
//cuda_GMRES that calls the kernel cuda_dot 

int main (int argc,char* argv[]) 
{ 
//content 
//bla bla bla 
//cuda Function call 
    cuda_GMRES(50); 
    return 0; 
} 

내 cuda_wrapper.h 파일을 호출하는 기능 커널을 포함

#ifndef Cuda_GMRES_cuda_wrapper_h 
#define Cuda_GMRES_cuda_wrapper_h 
//wrapper function declaration 

void cuda_GMRES(double a); 
#endif 

내 cuda_GMRES.cu 파일 :

#include <stdio.h> 
#include "cuda_wrapper.h" 
#include "cuda_dot.cu" 

//kernel declaration 
__global__ void cuda_dot(); 

//kernel calling function 
extern "C" 
void cuda_GMRES(double a) 
{ 
double b; 

double *dev_a; 
double *res; 

cudaMemcpy(dev_a, &a, sizeof(double), cudaMemcpyHostToDevice); 
cuda_dot<<< 1, 1 >>>(*dev_a, res); 
cudaMemcpy(&b, res, sizeof(double), cudaMemcpyDeviceToHost); 
}  

내 커널을 포함하는 cuda_dot.cu 파일 :

__global__ void cuda_dot(double a, double *help) 
{ 
    *help=2*a; 
} 
+0

a.out라는 기본 연결 프로그램을 방출합니다

nvcc -o executable main.o cuda_GMRES.o 
executable 최종 연결 프로그램의 이름입니다

, 또는

nvcc main.o cuda_GMRES.o 

당신이됩니다 'nvcc -o main.o cuda_GMRES.o'는 정말로 당신이 사용하고있는 연결 명령입니까? – talonmies

+0

예 .. 오류없이 작동해야한다고 생각하십니까? –

+0

아니요 문제가 있습니다 – talonmies

답변

4

연결 명령에 치명적인 오류가있는 것 같습니다. 먼저 다음과 같이 두 개체를 컴파일 치죠 :

gcc -c main.c 
nvcc -c cuda_GMRES.cu 

는 두 개의 오브젝트 파일 main.ocuda_GMRES.o이 있어야합니다. 그런 다음이 작업을 수행 :

nvcc -o main.o cuda_GMRES.o 

이 명령 말한다 즉, "cuda_GMRES.o를 사용하여 main.o를라는 프로그램 파일을 연결". main.o를 덮어 씁니다. 링커가 누락 된 기본 서브 루틴에 대해 불평하고, 하나도 제공하지 않고 (동시에 하나의 객체 파일을 포함하고있는 객체 파일을 파괴하고 있기 때문에) 이런 이유 때문입니다.

당신이 뭔가 싶어 :