如何使用extern cuda设备变量

时间:2012-11-28 04:12:43

标签: c cuda header-files

我需要将代码写入几个.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我不能这样做。如果我这样做,它告诉我'..........'先前在这里宣布

1 个答案:

答案 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
$

对不起以前的错误。