gpt4 book ai didi

memory - 统一内存与固定主机内存的行为和性能

转载 作者:行者123 更新时间:2023-12-03 16:56:49 25 4
gpt4 key购买 nike

我是一名学生,目前正在从事一个项目,该项目包括在 CUDA 中编写某个程序。我相信这个程序的主题与问题无关;但我不得不提的是,我的教授在看到我尝试创建 CUDA 智能指针类后,建议我在我的程序中使用统一内存。最好将此类描述为满足 RAII 习惯用法的“指向数组的唯一指针”。

在查看了关于统一内存的 CUDA 6.0 发行说明(以及 CUDA 8.0 中引入的更新)后,我对是否应该切换到统一内存充满了疑问。

Q1:我知道CUDA统一内存是映射GPU和CPU内存。但是我们在谈论什么样的 CPU 内存呢?固定内存是否允许更快的数据传输?或者它是标准的分页系统内存?

Q2:我知道 CUDA 8.0 中引入的更新主要是关于 pascal 架构。但是我可以期待 Maxwell 架构的加速吗(关于主机固定内存)?

Q3:尽管我只是一名学生,但我可以看到 NVIDIA 在开发统一内存方面投入了大量工作。因此,从长远来看,人们可能会认为使用统一内存是一个更好的主意。我对吗?

Q4:每次我想访问主机上数组的单个元素(而数据驻留在设备上)时,整个数组都会被复制到主机是真的吗?

最佳答案

GPU 内存的智能指针

(部分)您最初的动机是为(全局)GPU 内存使用智能指针的可能性;你的教授建议为此使用统一内存(尽管我不太清楚这会有什么帮助)。好吧,问题是,您不必为此重新发明轮子 - 您已经可以拥有 unique_ptr用于(不同种类的)CUDA GPU 内存,作为 cuda-api-wrappers 的一部分图书馆。

这些唯一的指针实际上是 std::unique_ptr() ,但是使用自定义删除器(并且您使用适当的方法创建它们。您可以在 this doxygen page 上找到创建它们的方法列表(尽管此时文档非常部分)。

有关使用示例,请考虑 CUDA 示例示例 vectorAdd ,它执行两个向量的元素相加以产生第三个。 Here是同一个示例,对主机和设备内存(以及更普遍的 API 包装器)使用智能指针。

警告:我是 API 包装器库的作者,所以我倾向于使用它 :-)

(部分)回答您的具体问题

Q1: What kind of CPU memory are we talking about [for unified memory allocations]? Is it pinned memory... Or... standard paged system memory?



我不知道,但是您可以通过编写一个小程序轻松找出:
  • 分配一些托管内存。
  • 在主机端写入它。
  • 将其预取到 GPU,然后退出。

  • ... 并对其进行分析以确定 PCIe 带宽。使用 PCIe 3.0 并且没有干扰流量,我通常从固定内存中获得大约 12 GB/秒的数据,从未固定内存中获得大约一半的数据。

    Q2: ... in CUDA 8.0 ... can I expect acceleration on the Maxwell architecture (with respect to host pinned memory)?



    以我非常有限的经验,统一内存访问卡的性能在 CUDA 8.0 中相对于 CUDA 6.0 并没有提高。 (但在某些情况下,预取逻辑或通用代码优化可能会有一些底层更改,这些更改确实显示出改进。)无论如何,请记住 CUDA 6.0 不支持 sm_52 目标,因此您的问题有点没有实际意义。

    Q3: ... I can see that NVIDIA is putting a lot of work into developing unified memory. Therefore one might think that using unified memory is a better idea in long term perspective. Am I right?



    我相信你是错的。正如 CUDA 编程指南所建议的,统一内存是一种旨在简化内存访问和编程的机制;它为更统一、更简单的代码牺牲了一些速度。虽然 nVIDIA 的努力可能会在一定程度上减少使用它的开销,但没有疯狂的优化冲刺会让它消失。在开普勒特斯拉, using unified memory is typically up to 1.8x-2x slower在各种基准上;即使我没有 Maxwell 或 Pascal 的数据,我怀疑这会下降到让您更喜欢全面使用统一内存的程度。

    Q4: Is it true that each time I want to access single element of an array on host (while data reside on device) the whole array will be copied to host?



    不,托管内存是分页的;所以只有一个页面会被复制到 PCIe 总线上。但是如果数组很小,它可能是整个数组。

    关于memory - 统一内存与固定主机内存的行为和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43424494/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com