首页 > 解决方案 > 为什么我们不能拆分 __host__ 和 __device__ 实现?

问题描述

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

__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; }

反而?

标签: cudanvcc

解决方案


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; }

在这里测试一下

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


推荐阅读