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;のように書けます。次に、別の場所でデバイス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

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
$

以前のエラーで申し訳ありません。

于 2012-11-28T04:44:59.093 に答える