Проверьте, работает ли код на 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
}