2012-02-18 104 views
2

我在C中有一個大項目,我正在嘗試集成一些Cuda內核。我正在使用「gcc -c main.c」編譯我的c文件,使用「nvcc -c cuda_GMRES.cu」編譯我的.cu文件,然後嘗試使用nvcc鏈接兩個目標文件:「nvcc -o main。 o cuda_GMRES.o「,並收到以下錯誤:Cuda混合C項目鏈接

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o:在功能 _start': (.text+0x20): undefined reference to主 collect2:LD返回1個退出狀態

這是我第一次嘗試使用CUDA C文件結合起來,我可能會做一些wrong.Can有人幫我請。我在使用Rocks 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

默認鏈接的程序你確定'nvcc -o main.o cuda_GMRES.o'確實是你正在使用的鏈接命令? – talonmies 2012-02-18 12:33:27

+0

是的..你認爲它應該沒有錯誤? – 2012-02-18 12:36:06

+0

沒問題 – talonmies 2012-02-18 12:38:20

回答

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.正是由於這個原因,鏈接器正在抱怨缺少的主子程序,你沒有提供一個(並且你正在銷燬包含一個的目標文件)。

你想是這樣的:

nvcc -o executable main.o cuda_GMRES.o 

其中executable是最終鏈接程序的名稱,或

nvcc main.o cuda_GMRES.o 

這將發出名爲a.out