2012-12-06 43 views
1

因此,我正在編寫一個非常基本的CUDA代碼(向量補充),以教會自己瞭解CUDA編程的基礎知識。當我編寫一個.cu文件時,我已經得到了它的工作,但現在我正試圖使它與一個鏈接在一起的.c和.cu文件一起工作。我的main.c文件如下:將C代碼與Cuda代碼鏈接起來

#include "Test.h" 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
     int n = 1000; 
     size_t size = n * sizeof(float); 
     int i; 

     float *h_a = malloc(size), *h_b = malloc(size), *h_c = malloc(size); 

     for(i = 0; i < n; i++) { 
       h_a[i] = h_b[i] = i; 
     } 

     addVec(h_a, h_b, h_c, n); 

     exit(0); 
} 

這裏,Test.h只是說:

void addVec(float *, float *, float *, int); 

我vecAdd.cu文件說:

#include "Test.h" 

__global__ void vecAdd(float *a, float *b, float *c, int n) { 
     int i = blockDim.x * blockIdx.x + threadIdx.x; 

     if(i < n) 
       c[i] = a[i] + b[i]; 
} 

void addVec(float *a, float *b, float *c, int n) { 
     float *d_a, *d_b, *d_c; 
     size_t size = n * sizeof(float); 

     cudaMalloc(&d_a, size); 
     cudaMalloc(&d_b, size); 
     cudaMalloc(&d_c, size); 

     ... 
} 

我然後運行命令:

gcc -c -Wall -O3 main.c -o ../obj/main.o 
nvcc -c -O3 vecAdd.cu -o ../obj/vecAdd.o 
gcc -L/usr/local/cuda/lib64 -lcudart ../obj/main.o ../obj/vecAdd.o -o ../bin/nvTest 

前兩項工作正常。最後一個,當我嘗試鏈接兩個目標文件時,告訴我有一個未定義的addVec引用,儘管它在vecAdd.cu中定義了...我做錯了什麼?

回答

6

您有一個C/C++鏈接問題,與here描述的基本相同。這是因爲nvcc對主機代碼使用C++編譯器(創建C++樣式鏈接引用,即「mangling」),gcc將main.c解釋爲c(而不是C++)文件,因此創建c樣式鏈接引用。

至少有2種方法來解決這個問題:

  1. 轉換您的main.c成的main.cpp和使用G ++,你正在使用gcc(你的第一個和第三編譯和鏈接步驟) 。那麼一切都會一直是C++風格的引用。
  2. 在您的C++模塊(vecAdd.cu)中聲明外部引用應該是C風格,如here所述。
+0

謝謝先生,這個作品完美。 – wolfPack88

相關問題