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__
例に入れていることがわかります。質問は両方に当てはまります。