3

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

一个例子

文件 common.h

__device__ int x;

文件 A.cu

__global__ void a() 

文件 B.cu

__global__ void b() 

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

在 C 语言中,我应该写一些类似 extern device int x; 然后我在另一个地方定义device int x 。但是在CUDA中我做不到。如果我这样做了,它会告诉我“…………”之前在这里声明过

4

1 回答 1

5

编辑:@talonmies 是对的(像往常一样)。所以我删除了我对 CUDA 4.1 的评论

此外,我给出的编译命令也不太正确。因此,让我用一个明显有效且具有正确说明的答案来代替我的答案。

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

我确信可能有更好的方法,但这似乎对我有用:

com.h:

#ifndef DEVMAIN
extern __device__ int x;
#endif

铜:

#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
$

对不起我以前的错误。

于 2012-11-28T04:44:59.093 回答