如何使用CUDA的extern设备变量(How to use extern cuda device

2019-08-03 06:48发布

我需要的代码编写成几个.CU文件。 但我应该在哪里定义设备变量,是使用了很多.CU文件。

一个例子

文件COMMON.H

__device__ int x;

文件A.cu

__global__ void a() 

文件B.cu

__global__ void b() 

一个(),B()都使用X。 我该怎么办?

在C语言中,我应该写类似的extern 装置 INT X; 然后,我在另一个地方定义装置 INT X。 但在CUDA我不能这样做。 如果我这样做,它告诉我“..........”这里以前声明

Answer 1:

编辑 :@talonmies是正确的(像往常一样)。 所以,我已经删除了我的约4.1 CUDA评论

此外,我给了编译命令是不完全正确。 因此,让我有一个demonstrably工作,并有适当的指令取代我的答案。

你需要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
$

对不起,我以前的错误。



文章来源: How to use extern cuda device variables