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

时间:2018-10-14 08:53:42

标签: cuda nvcc

如果我们在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; }

相反?

1 个答案:

答案 0 :(得分:1)

CUDA C ++的Clang实现实际上支持__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; } ,因为它认为执行空间限定符是函数签名的一部分。但是请注意,即使在那儿,也必须分别声明这两个函数:

foo(int x)

test it out here

就我个人而言,我不确定这到底有多么可取/重要。考虑到您只需在CUDA源代码之外的主机代码中定义{{1}}即可。如果有人告诉我他们需要针对主机和设备使用同一功能的不同实现,而出于某种原因需要将主机版本定义为CUDA源的一部分,那么我的最初直觉是可能有一些事情要做一个奇怪的方向。如果主机版本的功能有所不同,那么它难道不应该使用不同的名称吗?如果在逻辑上不使用GPU就做同样的事情,那么为什么它必须成为CUDA源的一部分?我通常会提倡在主机和设备代码之间保持尽可能清晰和严格的分隔,并将CUDA源代码中的任何主机代码保持在最低限度。即使您不关心代码的简洁性,这样做也至少可以将所有隐藏在后台的编译器魔术所伤害的可能性降到最低……