为什么我们不能拆分__host__和__device__实现?



如果我们在 CUDA 中有一个__host__ __device__函数,我们可以使用宏为其实现中的主机端和设备端代码选择不同的代码路径,如下所示:

__host__ __device__ int foo(int x)
{
#ifdef CUDA_ARCH
return x * 2;
#else
return x;
#endif
}

但是为什么我们不能写:

__host__ __device__ int foo(int x);
__device__ int foo(int x) { return x * 2; }
__host__   int foo(int x) { return x; }

相反?

> CUDA C++的 Clang 实现实际上支持__host____device__因为它将执行空间限定符视为函数签名的一部分。但是请注意,即使在那里,您也必须分别声明这两个函数:

__device__ int foo(int x);
__host__ int foo(int x);
__device__ int foo(int x) { return x * 2; }
__host__   int foo(int x) { return x; }

在这里进行测试

就个人而言,我不确定这到底有多可取/重要。考虑到您可以在 CUDA 源之外的主机代码中定义一个foo(int x)。如果有人告诉我他们需要为主机和设备提供相同功能的不同实现,其中由于某种原因需要将主机版本定义为 CUDA 源的一部分,我最初的直觉是可能有一些事情朝着一个奇怪的方向发展。如果主机版本执行不同操作,则它很可能具有不同的名称吗?如果它在逻辑上做同样的事情只是不使用 GPU,那么为什么它必须是 CUDA 源的一部分?我通常主张尽可能保持主机和设备代码之间的干净和严格分离,并将 CUDA 源中的任何主机代码保持在最低限度。即使你不关心代码的清洁度,这样做至少可以最大限度地减少被引擎盖下发生的所有编译器魔法伤害的机会......

最新更新