【问题标题】:cuda unified memory: memory transfer behaviourcuda统一内存:内存传输行为
【发布时间】:2016-12-18 11:23:32
【问题描述】:

我正在学习 cuda,但目前还没有访问 cuda 设备,并且对一些统一的内存行为感到好奇。据我了解,统一内存功能在需要知道的基础上将数据从主机传输到设备。因此,如果 cpu 在 gpu 上调用某些数据 100 次,它只会在第一次尝试时传输数据并清除 gpu 上的内存空间。 (到目前为止我的解释正确吗?)

1 假设这一点,是否存在一些行为,如果旨在适合 gpu 的编程结构对于设备内存来说太大,UM 是否会交换一些最近访问的数据结构以腾出空间下一个需要完成计算还是必须手动完成?

2 此外,如果您能澄清与内存传输行为相关的其他内容,我将不胜感激。很明显,在访问实际数据时数据会被反向传输,但是访问指针呢?例如,如果我有 2 个相同 UM 指针的数组(指针中的数据当前在 gpu 上,并且从 cpu 执行以下代码)并且要对第一个数组进行切片,也许是要删除一个元素,那么迭代跨过被放置到新数组中的指针,以便访问数据以进行 cudamem 传输?肯定不会。

【问题讨论】:

    标签: pointers memory cuda


    【解决方案1】:

    据我了解,统一内存功能在需要知道的基础上将数据从主机传输到设备。因此,如果 cpu 在 gpu 上调用某些数据 100 次,它只会在第一次尝试时传输数据并清除 gpu 上的内存空间。 (到目前为止我的解释正确吗?)

    第一部分是正确的:当 CPU 尝试访问驻留在设备内存中的页面时,它会透明地传输到主内存中。设备内存中的页面发生了什么可能是一个实现细节,但我想它可能不会被清除。毕竟,它的内容只需要刷新如果CPU 写入页面并且它被设备再次访问。我想最好问问 NVIDIA 的人。

    假设这一点,是否存在一些行为,如果旨在适合 gpu 的编程结构对于设备内存来说太大,UM 是否会交换一些最近访问的数据结构,以便为下一个需要完成的数据结构腾出空间还是必须手动完成?

    在 CUDA 8 之前,不,您不能分配比设备可以容纳的更多(oversubscribe)。从 CUDA 8 开始,有可能:页面在设备内存中进出错误(可能使用 LRU 策略,但我不确定是否在任何地方指定),这允许处理原本不适合设备的数据集并且需要手动流式传输。

    很明显,在访问实际数据时数据会被反向传输,但是访问指针呢?

    它的工作原理完全相同。无论您是取消引用由cudaMalloc(甚至malloc)返回的指针,还是该数据中的某个指针,都没有区别。驱动程序同样处理它。

    【讨论】:

    • 也许我最后一个问题的例子不是很清楚,我并不是要释放指针中的内存。即有 2 个数组具有相同的 UM 指针,但形成第一个我希望切片出一些。实际数据并不意味着被释放,只是发生了一些指针播放。你会碰巧知道这种行为吗?
    • 我不明白你的评论,我没有提到释放任何东西。
    • 对不起,我对您的反应的可视化很奇怪,我想您验证了我认为会发生的事情。玩指针不会启动设备之间的任何内存传输。
    • 我不确定您所说的“玩指针”是什么意思。触发“内存传输”的是页面错误,即当您取消引用指向当前不在内存中物理的地址的指针时.将指针作为 操作不会触发页面错误。
    • 超额订阅能力不是取决于计算能力而不是CUDA版本吗(你显然需要更新版本的CUDA来获得最新的计算能力,但仍然如此)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2017-04-30
    • 2014-04-19
    • 2018-11-13
    相关资源
    最近更新 更多