2014-01-28 101 views
-1

我使用推力与cuda 5.5进行整数向量排序。 。 排序100 * 1024 * 1024 INT的应分配400MB存储器,但NVIDIA-SMI节目总是 “存储器使用的105MB/1023MB”(我的测试GPU是GTX260M)如何获得最大的数组大小适合gpu内存?

排序150 * 1024 * 1024给出分配错误:

GPU memory usage: used = 105.273682, free = 918.038818 MB, total = 1023.312500 MB

我可以查看可用最大内存为我整型数组GPU开始分析之前:

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

数组分配之前,我使用cudaMemGetInfo它返回检查内存?

编辑:

好吧,之前我的排序内存使用量大约是这个。 GPU内存使用情况:used = 545.273682,free = 478.038818 MB,total = 1023.312500 MB

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

+0

我想你的GetInfo有问题。正如你所说的,你先分配了400MB,然后再分配另一个600MB,这对你的略小于1000MB的设备来说非常重要。 – LumpN

+0

好的,我检查了nvidia-smi没有显示正确的用法。 – Arman

回答

1

推力分选操作require significant extra temporary storage

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

我一般发现推力能够将阵列排序高达GPU的大约40%的内存。但没有指定的号码,您可能需要通过反复试验来确定。

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

+0

是的,这是一个麻烦。我检查了特斯拉w/o显示器,我从3GB中获得2.8GB。在笔记本电脑上我总是使用150Mb,但不知何故。在特斯拉nvidia-smi显示正确的内存使用情况,但不是在笔记本电脑上;(。 – Arman