1

データの受け渡しを容易にするために、ホスト コードとデバイス コードの両方で使用するクラスがあります。このクラスには、データを操作するいくつかのメソッドがあります。簡単な例は次のとおりです。

struct Vector {
  float x, y, z;
  __host__ __device__ Vector(float _x, float _y, float _z) {
    //...
  }
};

このクラスをヘッダー ファイルに実装すると、問題なく動作し、nvcc は満足しています。ただし、ソース ファイルにコンストラクターを実装しようとすると、nvcc はコンストラクターがインライン化されていないと文句を言います。これをバイパスする方法はありますか、それともコンパイラの制限にすぎませんか?

4

1 に答える 1

1

CUDA 5.0 まで、CUDA コンパイラには、カーネル (つまり__global__関数) が必要とするすべてのものが単一の翻訳単位になければならないという制限がありました。Fermi 以前のデバイス (つまり、compute capability 1.x) の場合、コンパイラはすべての__device__関数をインライン化する必要もありました。したがって、ファイル a.cu で定義され__global__た構造体と、b.cu で定義された構造体を使用するカーネルがある場合、コンパイラが b.cu を処理しているときに、関数を見つけることができません__device__

CUDA 5.0 では、2 つのファイルを別々にコンパイルし、それらをリンクすることができます。これには、引き続き Fermi 以降 (2.x 以降) が必要です。

于 2012-09-11T12:35:25.170 に答える