2013-01-31 129 views
1

我想將CUDA代碼與我現有的C++應用程序集成。正如在一些網絡端的指示,我需要有一個「file.cu」,我有一個包裝功能,它在GPU上執行內存分配並啓動內核。我遵循這個建議,但是,我現在無法編譯代碼。CUDA與C/C++編譯失敗

file.cu

#include <cuda.h> 
#include <stdio.h> 

void preComputeCorrelation_gpu(int * d) 
{ 
    //I shall write the kernel later once I am confirmed that CUDA code works 
    cudaDeviceProp prop; 
    cudaGetDeviceProperties(&prop, 0); 
    printf("name = %s\n", prop.name); 
} 

的main.cpp

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#include <cuda.h> 

#define __CUDA_SUPPORT__ 

#ifdef __CUDA_SUPPORT__ 
// Defination to be found in "cudaWrap.cu" 
extern void preComputeCorrelation_gpu(int * d); 
#endif 


int main() 
{ 
//code to read d from the file and other initialization 
int * d; 
. 
. 

#ifdef __CUDA_SUPPORT__ 
    fprintf(stderr, "GPU Computation starts"); 
    // Defination to be found in "cudaWrap.cu" 
    preComputeCorrelation_gpu(d); 
#else 
    fprintf(stderr, "CPU Computation starts"); 
    preComputeCorrelation(d); 
#endif 


. 
. 
//more code 

return 0 ; 
} 

現在,我把下面的命令來編譯代碼

$ nvcc -c cudaWrap.cu <br/> 
$ g++ -I /usr/local/cuda-5.0/include -L /usr/local/cuda-5.0/lib -o GA_omp GA_dev_omp.cpp main_omp.cpp data_stats.cpp cudaWrap.o 

編譯失敗,我得到後以下信息第二個命令。儘管第一條命令起作用。

cudaWrap.o: In function `preComputeCorrelation_gpu(DataSet*)': 
tmpxft_00001061_00000000-3_cudaWrap.cudafe1.cpp:(.text+0x2f): undefined reference to `cudaGetDeviceProperties' 
cudaWrap.o: In function `__cudaUnregisterBinaryUtil()': 
tmpxft_00001061_00000000-3_cudaWrap.cudafe1.cpp:(.text+0x6b): undefined reference to `__cudaUnregisterFatBinary' 
cudaWrap.o: In function `__sti____cudaRegisterAll_43_tmpxft_00001061_00000000_6_cudaWrap_cpp1_ii_f8a043c5()': 
tmpxft_00001061_00000000-3_cudaWrap.cudafe1.cpp:(.text+0x8c): undefined reference to `__cudaRegisterFatBinary' 
collect2: ld returned 1 exit status 

我該如何解決這個問題呢?

+1

忘記鏈接libcudart.so。在g ++命令的末尾加上-lcudart,它應該編譯。 – hubs

+0

完美...現在它的作品...謝謝! – mkuse

+0

@mkuse:如果您將解決方案添加爲答案,將會有所幫助。在幾天之內,您將能夠接受它,並且將從未答覆的列表中解決問題。 – talonmies

回答

0

解決這個問題是普通的C++代碼的那個鏈接,並需要與libcudart.so

編制完成應該有的像CUDA代碼 -

$ nvcc -c cudaWrap.cu 
$ g++ -lcudart -I /usr/local/cuda-5.0/include -L /usr/local/cuda-5.0/lib -o GA_omp GA_dev_omp.cpp main_omp.cpp data_stats.cpp cudaWrap.o 

在這種情況下, cudaWrap.cu包含cuda代碼。 main_omp.cpp包含main(),還有一些其他應用程序文件也需要編譯。