私は CUDA クラスを持っています。それを と呼びましょうA
。ヘッダー ファイルで定義されています。class のインスタンスを作成するテストカーネルを作成しました。これはA
正常にコンパイルされ、期待される結果が生成されます。
さらに、メインの CUDA カーネルも正常にコンパイルされ、期待どおりの結果が得られます。ただし、コードをメイン カーネルに追加して class のインスタンスをインスタンス化するA
と、nvcc コンパイラがセグメンテーション エラーで失敗します。
アップデート:
明確にするために、セグメンテーション違反は、カーネルの実行時ではなく、コンパイル中に発生します。コンパイルに使用している行は次のとおりです。
`nvcc --cubin -arch compute_20 -code sm_20 -I<My include dir> --keep kernel.cu`
where<My include dir>
は、いくつかのユーティリティ ヘッダー ファイルを含むローカル パスへのパスです。
私の質問は、動作を示す最小限の例を分離するのに多くの時間を費やす前に (コードベースが比較的大きいため、簡単ではありません)、誰かが同様の問題に遭遇したことがありますか? カーネルが長すぎるか、使用するレジスタが多すぎる場合、nvcc コンパイラが失敗して停止する可能性はありますか?
レジスタ カウントなどの問題がこのようにコンパイラに影響を与える可能性がある場合は、使用するリソースを減らすためにカーネルを実装する方法を再考する必要があります。これは、物事を最小限の例に切り詰めることで、問題が解消される可能性が高いことも意味します。ただし、これが可能ではない場合でも、行き止まりで時間を無駄にしたくはありませんが、最小限の例に切り詰めて、NVIDIA にバグ レポートを提出します。
アップデート:
@njuffa の提案に従って、-v
フラグを有効にしてコンパイルを再実行しました。出力は次で終了します。
#$ ptxas -arch=sm_20 -m64 -v "/path/to/kernel_ptx/kernel.ptx" -o "kernel.cubin"
Segmentation fault
# --error 0x8b --
ptxas
これは、ファイルから CUDA バイナリを生成できないプログラムが問題の原因であることを示唆していptx
ます。