編輯:@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
$
對不起,我以前的錯誤。
值得指出的是,在CUDA 5中可能只有合法的設備代碼鏈接器。 – talonmies
@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
@RobertCrovella和D_T_H是'#define D_T_H cudaMemcpyDeviceToHost' – worldterminator