【问题标题】:how to get maximum array size fitting in to gpu memory?如何获得适合gpu内存的最大数组大小?
【发布时间】:2014-01-31 04:20:55
【问题描述】:

我正在使用带有 cuda 5.5 的推力来进行整数向量排序。 排序 100*1024*1024 int 应该分配 400MB 内存,但 nvidia-smi 总是显示“Memory-Usage 105MB / 1023MB”。(我的测试 GPU 是 GTX260M)

排序 150*1024*1024 会出现分配错误:

terminate called after throwing an instance of 'thrust::system::detail::bad_alloc'
  what():  std::bad_alloc: out of memory
Aborted (core dumped)

在分配数组之前,我正在使用它返回的 cudaMemGetInfo 检查内存:

GPU 内存使用量:已用 = 105.273682,可用 = 918.038818 MB,总计 = 1023.312500 MB

我可以在开始 gpu 分析之前检查我的整数数组的最大可用内存吗?

编辑:

好的,在排序之前我的内存使用是关于这个的。 GPU 内存使用量:已用 = 545.273682,可用 = 478.038818 MB,总计 = 1023.312500 MB

在我看来排序算法需要一些额外的内存。

【问题讨论】:

  • 我猜您的 GetInfo 有问题。如前所述,您首先分配 400MB,然后尝试再分配 600MB,这对于您的略低于 1000MB 的设备来说太多了。
  • 好的,我检查了 nvidia-smi 没有显示正确的用法。

标签: c++ arrays memory cuda thrust


【解决方案1】:

推力排序操作require significant extra temporary storage

nvidia-smi 在不同时间有效地对内存使用情况进行采样,并且在采样点使用的内存量可能无法反映您的应用程序使用(或需要)的最大内存量。正如您所发现的,cudaMemGetInfo 可能更有用。

我通常发现推力能够对多达 GPU 上大约 40% 内存的数组进行排序。但是没有指定的数字,您可能需要通过反复试验来确定。

不要忘记 CUDA 会使用一些开销内存,如果您的 GPU 托管显示器,那也会消耗额外的内存。

【讨论】:

  • 是的,这很麻烦。我检查了没有显示器的特斯拉,我从 3GB 中得到了 2.8GB。在笔记本电脑上,我的 150Mb 总是被使用,但不知何故。在 Tesla 上,nvidia-smi 显示正确的内存使用情况,但在笔记本电脑上不显示;(.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2022-01-03
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多