Написание кода для компиляторов cuda и не-cudaC++

Программы на C++. Форум разработчиков
Anonymous
Написание кода для компиляторов cuda и не-cuda

Сообщение Anonymous »

Проблема:
Мы пишем код Cuda, который также должен компилироваться не-cuda-компиляторами (мы используем: nvcc, gcc и clang).
Поскольку Cuda требует повсюду эти аннотации __host__ __device__, мы решили эту проблему, включив в каждый рассматриваемый файл следующий заголовок:
Наше решение:

Код: Выделить всё

// CudaTags.hpp
#ifndef CUDAFLAGS
#define CUDAFLAGS
#ifndef __CUDACC__
#define __host__
#define __device__
#endif
#endif
Так что мы можем сделать в исходном файле:

Код: Выделить всё

#include "CudaTags.hpp"
__host__ __device__ func();
Вопросы:
Пока я не вижу никаких (за исключением Примечания ниже) проблем с этим подходом. Таким образом,
  • Видите ли вы какие-либо проблемы, которые я пропустил?
  • Какие еще существуют возможности решения этой проблемы? ?
Примечание: Я знаю, что мое решение — UB, потому что я использую идентификаторы, начинающиеся с двумя подчеркиваниями. Хотя также обратите внимание, что очень маловероятно, что это приведет к UB, потому что хост-компилятор никогда не будет использовать эти идентификаторы для себя (поскольку Cuda уже взял их).
Конечно, я тоже мог бы сделать

Код: Выделить всё

#ifndef CUDAFLAGS2
#define CUDAFLAGS2
#ifndef __CUDACC__
#define CUDA_HOST
#define CUDA_DEVICE
#define CUDA_MANAGED
#define CUDA_GLOBAL
#else
#define CUDA_HOST    __host__
#define CUDA_DEVICE  __device__
#define CUDA_MANAGED __managed__
#define CUDA_GLOBAL  __global__
#endif
#endif
и использовать его как

Код: Выделить всё

CUDA_HOST CUDA_DEVICE void func();
Но при таком подходе мне приходится использовать специальные имена, затирать глобальное пространство имен, и это выглядит очень некрасиво.

Подробнее здесь: https://stackoverflow.com/questions/766 ... -compilers

Вернуться в «C++»