5

C++ のように、コンパイルの最後にリンクされるように、CUDA コードを個別のオブジェクト ファイルに編成したいと考えています。__constant__そのために、ヘッダー ファイルでメモリへの extern ポインターを宣言し、その定義を .cu ファイルの 1 つに配置できるようにしたいと考えています。これも C++ のパターンに従います。しかし、そうすると、nvcc は「extern」を無視するようです。各宣言を定義として使用します。これを回避する方法はありますか?

コードとエラーについてより具体的に説明するために、ヘッダー ファイルに次のように記述します。

extern __device__ void* device_function_table[];

.cu ファイルでこれが続きます。

void* __device__ device_function_table[200];

コンパイル時に次のエラーが発生します。

(path).cu:40: error: redefinition of ‘void* device_function_table [200]’
(path).hh:29: error: ‘void* device_function_table [200]’ previously declared here

私の現在の解決策は、Makefile マジックを使用して、すべての .cu ファイルをまとめて、実質的に 1 つの大きな翻訳単位を作成することですが、ファイル構成は似ています。しかし、これはすでにコンパイルを著しく遅らせています。なぜなら、私のクラスのいずれかを変更すると、それらすべてを再コンパイルすることになるからです。さらにいくつかのクラスを追加する予定です。

__constant__編集:テキストと__device__例に入れていることがわかります。質問は両方に当てはまります。

4

3 に答える 3

3

CUDA Cプログラミングガイドバージョン4.0、セクションD.2.1.1から。

、および修飾子は__device__、次では使用できません。__shared____constant__

  • クラス、構造体、およびユニオンデータメンバー、
  • 正式なパラメータ、
  • ホスト上で実行される関数内のローカル変数。

__shared____constant__変数は静的ストレージを意味します。

__device__変数はファイルスコープで__constant__のみ許可されます。

__device____shared__および__constant__変数は、externキーワードを使用して外部として定義することはできません。唯一の例外は__shared__、セクションB.2.3で説明されている動的に割り当てられた変数の場合です。

于 2011-11-01T14:01:09.043 に答える
3

CUDA 5.0 以降、個別のコンパイルとリンクが有効になっている場合、CUDA を使用して外部で定義されたデータを持つことが可能になりました。このブログ投稿で説明しています: http://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/

これが完了したら、元の投稿のように使用するだけで、「機能する」だけです。

于 2015-10-20T11:29:13.273 に答える