【问题标题】:Is there a way to know what's the extra space that cudaMalloc is going to reserve?有没有办法知道 cudaMalloc 将保留多少额外空间?
【发布时间】:2015-12-15 07:05:08
【问题描述】:

当我使用 cudaMalloc (100) 时,它保留了超过 100 B (根据这里的一些用户,这是由于粒度问题和内务信息。

是否可以根据我需要保留的字节来确定这个空间有多大?

非常感谢。

编辑:我会解释为什么我需要知道。

我想在 GPU 上的大图像上应用卷积算法。为此,由于 GPU 上没有足够的内存来保存它,我需要将图像分成几行并多次调用内核。

实际上,我需要发送 2 个图像,OnlyRead 矩阵和 Results 矩阵。

我想根据可用内存量先验计算我可以发送到设备的最大行数。

第一个 cudaMalloc 成功执行,但在尝试执行第二个 CudaMalloc 时出现问题,因为第一个保留占用的字节数比预期的多。

我现在正在做的是考虑可用内存量比实际少 10%...但这只是一个不知从何而来的神奇数字..

【问题讨论】:

  • This 可能具有指导意义:“驻留在全局内存中或由驱动程序或运行时 API 的内存分配例程之一返回的变量的任何地址始终与至少 256 个字节对齐。”因此,我希望任何分配请求至少“用完”到下一个更高的 256 字节的偶数倍。话虽如此,AFAIK 没有明确指定您的问题的答案,因此试图发现它是什么然后依赖它可能是有风险的。
  • @RobertCrovella 我可以知道为什么是“256 字节的偶数倍”吗?为什么不至少使用 256 的下一个倍数?
  • 还有this post 是相关的。
  • 对不起,我的意思是一个“整数”倍数。我用“偶数倍数”来指代非分数倍数,但我应该说“整数倍数”或“整数倍数”
  • 你为什么想知道?是因为您正在进行许多小分配,并且不想要开销吗?如果是这样,请编写自己的分配器。如果您正在尝试开发依赖于运行时行为的代码,请立即停止并寻求另一种方法。

标签: cuda malloc space granularity


【解决方案1】:

“有没有办法知道 cudaMalloc 将保留多少额外空间?”

不会违反 CUDA 的平台保证。 cudaMalloc() 返回一个指向所请求内存量的指针。您不能对在请求量结束后恰好有效的内存量做出任何假设 - CUDA 分配器已经使用了子分配器,并且与基于 CPU 的内存分配器不同,用于跟踪空闲列表的数据结构等. 不与分配的内存交错。因此,例如,假设 CUDA 运行时对返回指针对齐的保证意味着除了返回的指针将具有一定的对齐之外的任何东西是不明智的。

如果您研究 CUDA 运行时的行为,将会了解该特定 CUDA 运行时的行为,但该行为可能会随着未来的版本而改变并破坏您的代码。

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 2021-06-14
    • 2019-03-13
    • 2018-01-17
    • 2011-07-31
    • 1970-01-01
    • 2019-03-21
    • 2020-06-14
    相关资源
    最近更新 更多