我需要将代码写入几个.cu文件中。但是,我应该在哪里定义用于许多.cu文件的设备变量。
一个例子
文件common.h
__device__ int x;
档案A.cu
__global__ void a()
档案B.cu
__global__ void b()
a(),b()都使用x。我该怎么办?
在C语言中,我应该写一些类似的东西 extern 设备 int x; 然后我在另一个地方定义设备 int x。但是在CUDA我不能这样做。如果我这样做,它告诉我'..........'先前在这里宣布
答案 0 :(得分:5)
编辑:@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
$
对不起以前的错误。