7

Cudaを使用してGPUまたはCPUでコードが実行されているかどうかを確認する方法を知っている人はいますか?

__device__ __host__  double count_something(double variable) {
  if (RUN_ON_GPU) {
    use_cuda_variables();
  } else {
    use_cpu_variables();
  }
}
4

2 に答える 2

13

コードの一部が実行されているアーキテクチャを実行時にチェックする方法はありませんが、コンパイル時に判断して適切に処理できるため、知る必要もありません。nvccコードのコンパイル中にコンパイルの軌跡を解析するために使用できるいくつかのプリプロセッサ シンボルを定義します。キー シンボルは__CUDA_ARCH__、ホスト コードのコンパイル時には定義されず、デバイス コードのコンパイル時には常に定義されます。

したがって、次のような関数を書くことができます。

__device__ __host__ float function(float x)
{
#ifdef __CUDA_ARCH__
    return 10.0f * __sinf(x);
#else
    return 10.0f * sin(x);
#endif
}

これは、GPU 用にコンパイルされているかホスト用にコンパイルされているかによって、異なるコードを発行します。このスタック オーバーフローの質問またはCUDA プログラミング ガイドのC 言語拡張セクションで、コンパイル ステアリングに関するより詳細な説明を読むことができます。

于 2013-05-01T07:02:26.100 に答える
4

コメントに適切なコード マークダウンを追加できません。完全な回答を追加することにしました。定義検査のみを使用__CUDA_ARCH__することは、完全には正しくありません。場合によっては、このコードが機能しないことがあります - 解決策を見つける前に、デバッグに多くの時間を費やしました (CUDA のドキュメントでは、現在それについて言及されていません)。
__CUDA_ARCH__ホストコードでも定義できますが、その場合は 0 に定義されます。したがって、適切なチェックは次のようなものです。

__device__ __host__ float function(float x)
{
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 0))
    // device code here
    return 10.0f * __sinf(x);
#else
    // host code here
    return 10.0f * sin(x);
#endif
}
于 2014-12-03T21:05:48.050 に答える