2012-11-28 49 views
2

我需要將代碼寫入幾個.cu文件。但我應該在哪裏定義用於許多.cu文件的變量設備如何使用extern cuda設備變量

一個例子

文件COMMON.H

__device__ int x; 

文件A.cu

__global__ void a() 

文件B.cu

__global__ void b() 

一個(),B()都使用x。我該怎麼辦?

在C語言中,我應該寫如 extern 設備 int x; 然後我在另一個地方定義了設備 int x。但在CUDA中,我無法做到這一點。如果我這樣做,它會告訴我以前在此處聲明的'..........'

回答

4

編輯:@talonmies是正確的(如往常一樣)。所以我刪除了我對CUDA 4.1的評論。

此外,我給出的編譯命令並不完全正確。所以讓我把我的答案替換爲一個可以工作並且有正確指示的答案。

您需要CUDA 5.0和計算能力2.0或更高版本的設備才能工作。

我敢肯定,有可能是一個更好的辦法,但是這似乎爲我工作:

com.h:

#ifndef DEVMAIN 
extern __device__ int x; 
#endif 

a.cu:

#include "com.h" 
__global__ void a(){ 

    x = -5; 
} 

b .cu:

#include <stdio.h> 
#define DEVMAIN 
#include "com.h" 

extern __global__ void a(); 
__device__ int x; 

__global__ void b(){ 

    x = 5; 
} 

int main() { 
    int temp=7; 
    cudaMemcpyToSymbol(x,&temp, sizeof(int)); 
    a<<<1,1>>>(); 
    cudaMemcpyFromSymbol(&temp,x,sizeof(int)); 
    printf("in host : %d\n",temp); 
    b<<<1,1>>>(); 
    cudaMemcpyFromSymbol(&temp,x,sizeof(int)); 
    printf("in host2 : %d\n",temp); 
    return 0; 
} 

編譯:

nvcc -arch=sm_20 -dc a.cu 
nvcc -arch=sm_20 -dc b.cu 
nvcc -arch=sm_20 -o ab a.o b.o 

輸出:

$ ./ab 
in host : -5 
in host2 : 5 
$ 

對不起,我以前的錯誤。

+0

值得指出的是,在CUDA 5中可能只有合法的設備代碼鏈接器。 – talonmies

+0

@RobertCrovella我試過你的代碼,你可以試試這個代碼,它應該是1,-1但是它是1,1。'int main(){ \t int temp; \t b <<<1,1> >>(); \t cudaMemcpyFromSymbol(&temp,x,sizeof(int),0,D_T_H); \t printf(「in host:%d \ n」,temp); a <<<1,1> >>(); cudaMemcpyFromSymbol(&temp,x,sizeof(int),0,D_T_H); printf(「in host2:%d \ n」,temp); cudaDeviceSynchronize(); return 0; }' – worldterminator

+0

@RobertCrovella和D_T_H是'#define D_T_H cudaMemcpyDeviceToHost' – worldterminator