Я пытаюсь скомпилировать некоторые функции, чтобы использовать их в коде хоста и коде устройства, но я получаю ошибку связывания с несколькими определениями.
Я пытаюсь достичь следующего:
У меня есть файл CudaConfig.h со следующим содержимым
CudaConfig.h
#ifdef __CUDACC__
#define CUDA_CALLABLE_DEVICE __device__
#define CUDA_CALLABLE_HOST __host__
#define CUDA_CALLABLE __host__ __device__
#else
#define CUDA_CALLABLE_DEVICE
#define CUDA_CALLABLE_HOST
#define CUDA_CALLABLE
#endif
В моем файле foo.h есть некоторые функции со следующей подписью
#include "CudaConfig.h"
struct Bar {Eigen::Vector3d v;};
CUDA_CALLABLE_DEVICE Eigen::Vector3d &foo(Bar &aBar);
и я реализую их в файлах foo.cpp и foo.cu.
foo.cpp
#include "foo.h"
Eigen::Vector3d &foo(Bar &aBar) {aBar.v += {1,1,1}; return aBar.v;}
foo.cu
#include "foo.h"
Eigen::Vector3d &foo(Bar &aBar) {aBar.v += {1,1,1}; return aBar.v;}
Мне нужно разделить обе реализации в разных файлах, так как Eigen отключает некоторые операции SIMD при использовании его из функции __device__
, поэтому я не хочу реализовывать обе в файле foo.cu по соображениям производительности.
Должен ли я реализовать эту функцию непосредственно в файле .h, помечая их как встроенные, чтобы у меня не было ошибки связывания с несколькими определениями? Поскольку Eigen отключает SIMD для кода __device__
, не приведет ли это к тому, что функции __host__
и __device__
будут отличаться от ожидаемых inline?