如何使用extern cuda设备变量

wor*_*tor 3 c cuda header-files

我需要将代码写入几个.cu文件中。但是我应该在哪里定义许多.cu文件使用的设备变量。

一个例子

文件common.h

__device__ int x;
Run Code Online (Sandbox Code Playgroud)

文件A.cu

__global__ void a() 
Run Code Online (Sandbox Code Playgroud)

文件B.cu

__global__ void b() 
Run Code Online (Sandbox Code Playgroud)

a(),b()都使用x。我该怎么办?

在C语言中,我应该编写类似extern device int x的代码;然后在另一个地方定义设备 int x。但是在CUDA中我做不到。如果我这样做,它会告诉我先前在此处声明的“ ..........”

Rob*_*lla 5

编辑:@talonmies是正确的(照常)。所以我删除了有关CUDA 4.1的评论。

此外,我给出的编译命令不太正确。因此,让我用一个明显可行且有适当指示的答案代替我的答案。

您需要CUDA 5.0和计算能力2.0或更高版本的设备才能正常工作。

我敢肯定有更好的方法,但这似乎对我有用:

com.h:

#ifndef DEVMAIN
extern __device__ int x;
#endif
Run Code Online (Sandbox Code Playgroud)

a.cu:

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

  x = -5;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

编译:

nvcc -arch=sm_20 -dc a.cu
nvcc -arch=sm_20 -dc b.cu
nvcc -arch=sm_20 -o ab a.o b.o
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./ab
in host : -5
in host2 : 5
$
Run Code Online (Sandbox Code Playgroud)

对不起,我以前的错误。

  • 您可以在[这里](http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#code-changes-for-separate-compilation)找到答案。使用CUDA 5,我们现在可以分别链接设备代码。为此,必须以可重定位的格式将编译后的设备代码传递给链接器。-dc指示编译器生成可重定位的设备代码,该代码可在以后链接。 (2认同)