cuda:设备函数内联和不同的.cu 文件

2023-11-29

两个事实:CUDA 5.0 允许您在不同的对象文件中编译 CUDA 代码,以便稍后链接。 CUDA 架构 2.x 不再自动内联函数。

像往常一样,在 C/C++ 中,我实现了一个函数__device__ int foo() in functions.cu并将其标题放入functions.hu。功能foo在其他 CUDA 源文件中调用。

当我检查时functions.ptx, 我看到foo()溢出到本地内存。为了测试的目的,我评论了所有的内容foo()刚刚成功return 1;根据.ptx。 (我无法想象它是什么,因为该函数什么也不做!)

但是,当我移动执行时foo()到头文件functions.hu并添加__forceinline__限定符,则不会将任何内容写入本地内存!

这里发生了什么?为什么CUDA不自动内联这么简单的函数?

单独的头文件和实现文件的全部目的是让我的代码维护更加轻松。但是如果我必须在标题中添加一堆函数(或全部)并且__forceinline__它们,那么它就违背了 CUDA 5.0 不同编译单元的目的......

有没有办法解决?


简单、真实的例子:

函数.cu:

__device__  int  foo
        (const uchar param0,
        const uchar *const param1,
        const unsigned short int param2,
        const unsigned short int param3,
        const uchar param4) 
{    
    return 1; //real code commented out.
} 

上述函数溢出到本地内存。

函数.ptx:

.visible .func  (.param .b32 func_retval0) _Z45fooPKhth(
        .param .b32 _Z45foohPKhth_param_0,
        .param .b64 _Z45foohPKhth_param_1,
        .param .b32 _Z45foohPKhth_param_2,
        .param .b32 _Z45foohPKhth_param_3
)
{
        .local .align 8 .b8     __local_depot72[24];
        .reg .b64       %SP;
        .reg .b64       %SPL;
        .reg .s16       %rc<3>;
        .reg .s16       %rs<4>;
        .reg .s32       %r<2>;
        .reg .s64       %rd<2>;

并非所有本地内存使用都会导致溢出。被调用的函数需要遵循 ABI 调用约定,其中包括在本地内存中创建堆栈帧。当 nvcc 传递命令行开关 -Xptxas -v 时,编译器将堆栈使用情况和溢出报告为其子组件。

目前(CUDA 5.0),CUDA 工具链不支持跨编译单元边界的函数内联,就像某些主机编译器所做的那样。因此,在单独编译的灵活性(例如,仅重新编译编译时间较长的大型项目的一小部分,以及创建设备端库的可能性)与通常由函数带来的性能增益之间存在权衡内联(例如,消除由于 ABI 调用约定造成的开销,实现额外的优化,例如跨函数边界的恒定传播)。

单个编译单元内的函数内联由编译器启发式控制,该编译器启发式尝试确定内联是否可能在性能方面有利可图(如果可能的话)。这意味着并非所有函数都可以内联。程序员可以使用函数属性覆盖启发式__forcinline__ and __noinline__.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda:设备函数内联和不同的.cu 文件 的相关文章

  • 用于类型比较的 Boost 静态断言

    以下问题给我编译器错误 我不知道如何正确编写它 struct FalseType enum value false struct TrueType enum value true template
  • 带 GPU 的 Lightgbm 分类器

    model lgbm LGBMClassifier n estimators 1250 num leaves 128 learning rate 0 009 verbose 1 使用 LGBM 分类器 现在有没有办法通过 GPU 来使用它
  • cudaMemcpyToSymbol 的问题

    我正在尝试复制到恒定内存 但我不能 因为我对 cudaMemcpyToSymbol 函数的用法有误解 我正在努力追随this http developer download nvidia com compute cuda 4 1 rel t
  • 使用 QuasirandomGenerator (对于傻瓜来说)

    我是 CUDA 的新手 我正在努力在内核中生成随机数 我知道有不同的实现 而且 在 SDK 4 1 中有一个 Niederreiter 拟随机序列生成器的示例 我不知道从哪里开始 我有点悲伤 感觉自己像个傻瓜 有人可以制作一个使用 Nied
  • 为什么 gcc 和 NVCC (g++) 会看到两种不同的结构大小?

    我正在尝试将 CUDA 添加到 90 年代末编写的现有单线程 C 程序中 为此 我需要混合两种语言 C 和 C nvcc 是 c 编译器 问题在于 C 编译器将结构视为特定大小 而 C 编译器将相同的结构视为略有不同的大小 那很糟 我对此感
  • 如何在C++中的cudaDeviceReset()之后重用tensorflow?

    我正在使用 C 开发一个大型 CUDA 应用程序 该应用程序运行各种模型 需要完全释放所有 GPU 内存 否则其他操作将失败 我能够在关闭所有 tf 会话并运行 cudaDeviceReset 后释放所有内存 但之后我无法运行任何新的张量流
  • 在 cuda 的 nvcc 编译器中使用 C++20

    我正在尝试使用std countr zero 函数从
  • 在linux上编译一个基本的OpenCV + Cuda程序

    我过去在linux上使用过opencv 但没有使用过cuda 几个月来我一直在与以下编译错误作斗争 在尝试了许多解决方案后 我放弃并使用 Windows 不过 我真的很想在 Linux 上工作 这是我用来编译 opencv gpu 网站上给
  • Visual Studio - 过滤掉 nvcc 警告

    我正在编写 CUDA 程序 但收到令人讨厌的警告 Warning Cannot tell what pointer points to assuming global memory space 这是来自 nvcc 我无法禁用它 有没有办法过
  • 如何在使用 GPU 支持编译的 macOS 上安装 Xgboost?

    我尝试在过去 3 天的 MacOS Mojave 10 14 6 上安装集成了 GPU 支持的 xgboost 但是没有成功 我尝试了两种方法 pip 安装 xgboost xgboost 安装在这里 并且在没有 GPU 选项的情况下成功运
  • 仅使用 CUDA 进行奇异值计算

    我正在尝试使用新的cusolverDnSgesvdCUDA 7 0 用于计算奇异值的例程 完整代码如下 include cuda runtime h include device launch parameters h include
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 如何并行从数组中删除零值

    如何使用 CUDA 并行有效地从数组中删除零值 有关零值数量的信息是预先可用的 这应该可以简化这项任务 重要的是数字必须保持源数组中的顺序 当被复制到结果数组时 Example 该数组将例如包含以下值 0 0 19 7 0 3 5 0 0
  • CUDA Visual Studio 2010 Express 构建错误

    我正在尝试在 64 位 Windows 7 上使用 Visual Studio 2010 Express 在 Windows 上开始 CUDA 编程 我花了一段时间来设置环境 然后我刚刚编写了我的第一个程序 helloWorld cu 目前
  • 在 Mac OS X 10.7.4 上使用 OpenCL 禁用 Nvidia 看门狗

    我有一个 OpenCL 程序 对于小问题运行良好 但是当运行较大的问题超过 Nvidia 硬件上运行内核的 8 10 秒时间限制时 虽然我没有将显示器连接到我正在计算的 GPU Nvidia GTX580 上 但一旦内核运行大约 8 10
  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • iOS 上的 OpenCV - GPU 使用情况?

    我正在尝试开发一个 iOS 应用程序 可以对来自相机的视频执行实时效果 就像 iPad 上的 Photobooth 一样 我熟悉 OpenCV 的 API 但如果大多数处理是在 CPU 上完成而不是在 GPU 上完成 我担心 iOS 上的性
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • Tensorflow:docker 镜像和 -gpu 后缀

    在具有 GPU 支持的 Tensorflow 的 Docker 映像中 例如 tensorflow tensorflow 2 2 0 gpu 安装的python包是tensorflow gpu 如图所示pip freeze 安装任何依赖于的

随机推荐