5

#defineによってコンパイル時にCUDAコンピューティング機能(バージョン)を取得するにはどうすればよいですか?たとえば、__ballotを使用してコンパイルする場合

nvcc -c -gencode arch=compute_20,code=sm_20  \
        -gencode arch=compute_13,code=sm_13
        source.cu

__ballotを使用した場合と使用しない場合のコードのブランチを選択するために、#defineによってコードの計算機能のバージョンを取得できますか?

4

1 に答える 1

15

はい。まず、 を使用すると何が起こるかを理解するのが最善です-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__にはxy0compute_xy. このマクロは、現在コンパイルされている仮想アーキテクチャを決定するために、GPU 関数の実装で使用できます。ホスト コード (非 GPU コード) はそれに依存してはなりません。

したがって、を使用したい場合は、次の__ballot()ようにできます。

....
#if __CUDA_ARCH__ >= 200
    int b = __ballot();
    int p = popc(b & lanemask);
#else
    // do something else for earlier architectures
#endif
于 2012-10-02T23:53:07.507 に答える