Проверьте, работает ли код на GPU или CPU

кто-нибудь знает, как проверить, работает ли код на GPU или CPU с помощью Cuda?

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

2 ответов


нет возможности время работы проверьте, на какой архитектуре выполняется фрагмент кода, но также нет необходимости знать, потому что он может быть определен во время компиляции и обработан соответствующим образом. 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 или хоста. Вы можете прочитать более подробное обсуждение о компиляции рулевого управления в этом вопрос переполнения стека или расширения языка C раздел руководства по программированию CUDA.


Я не могу добавить правильную уценку кода в комментариях-решил добавить полный ответ. Использование только __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
}