cuda - 为什么我们不能拆分 __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; }
反而?
解决方案
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 源代码中的任何主机代码保持在最低限度。即使您不关心代码的清洁度,
推荐阅读
- excel - 基于 Excel 中两列的不同值
- mongodb - Apollo Graphql 事件验证失败
- c - 动态矩阵问题。我该如何解决这个问题?
- java - 我如何将凭据从 rest 客户端发布到 spring security rest api?
- regex - 如何在aa文本文件中找到末尾带有问号的所有句子
- c++ - Kill-Counter 滞后游戏的透明覆盖
- mysql - 从包含连接的 MIN 查询中选择 ID
- python - python urllib.parse 不保留路径部分
- python - 如何将自变量列表传递给seaborn并获得单独的图
- sql - 嵌套存储过程,将变量设置为输出/结果