2012-08-06 125 views
0

我用cudaMalloc分配尺寸100的整数数组,即总我有CUDA:全球总存储器使用

int_total_bytes=100*sizeof(int), 

和分配大小1000的双打的阵列,即,总的I有

db_total_bytes=1000*sizeof(double),... 

我可以肯定的说总的GPU使用的全局内存将

int_total_bytes+db_total_bytes? 

的感谢!

+0

http://stackoverflow.com/q/8684770/681865,http://stackoverflow.com/q/8905949/681865 – talonmies 2012-08-06 23:51:26

回答

1

由于添加了填充以实现最佳地址对齐或最小块大小,有几种情况会使分配的内存实际大小大于计算的大小。

对于您给出的两个示例,数据大小与自然对齐大小和边界兼容,因此您可能看不到计算内存和实际内存之间的差异。不过,如果cudaMalloc使用suballocator - 如果它从OS(或设备)分配一个大块,然后将该大块细分为更小的块以填充cudaMalloc()请求,则可能仍会有一些变化。

如果涉及到suballocator,那么操作系统将显示实际的内存使用量远远大于您的计算使用量,但实际使用情况将保持稳定,即使您的应用程序进行多次小分配(可以从已分配的大块)。

类似地,硬件通常具有通常与存储器页面大小相同的最小分配大小。如果可以从硬件分配的最小内存块是64K,那么当你要求3k时,你已经分配了61K但是没有被使用。这是一个suballocator会很有用的地方,以确保您尽可能多地使用您分配的内存块。

0

除了dthorpe说的内容,您可以使用nvidia-smi命令检查进程的GPU内存使用情况。

+0

或在代码中使用[NVML](http://developer.nvidia.com/cuda/nvidia-management-library-nvml)使用'nvmlDeviceGetMemoryInfo'函数。 – 2012-09-20 13:38:05