はい。まず、 を使用すると何が起こるかを理解するのが最善です-gencode
。NVCC は、デバイス ターゲット アーキテクチャごとに 1 回、入力デバイス コードを複数回コンパイルします。したがって、この例では、NVCC は、compute_20 に対して 1 回、compute_13 に対して 1 回、コンパイル ステージ 1 を実行します。
nvcc が .cu ファイルをコンパイルすると、2 つのプリプロセッサ マクロ__CUDACC__
と__CUDA_ARCH__
. __CUDACC__
cudacc がコンパイラである場合は単純に定義され、そうでない場合は定義されません。
__CUDA_ARCH__
コンパイルされる SM バージョンを表す整数値に定義されます。
- 100 = 計算_10
- 110 = 計算_11
- 200 = 計算_20
など。CUDA ツールキットに含まれている NVCC ドキュメントを引用するには:
アーキテクチャ識別マクロ__CUDA_ARCH__
にはxy0
、compute_xy
. このマクロは、現在コンパイルされている仮想アーキテクチャを決定するために、GPU 関数の実装で使用できます。ホスト コード (非 GPU コード) はそれに依存してはなりません。
したがって、を使用したい場合は、次の__ballot()
ようにできます。
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif