我用cudaMalloc分配尺寸100的整数数组,即总我有CUDA:全球总存储器使用
int_total_bytes=100*sizeof(int),
和分配大小1000的双打的阵列,即,总的I有
db_total_bytes=1000*sizeof(double),...
我可以肯定的说总的GPU使用的全局内存将
int_total_bytes+db_total_bytes?
的感谢!
我用cudaMalloc分配尺寸100的整数数组,即总我有CUDA:全球总存储器使用
int_total_bytes=100*sizeof(int),
和分配大小1000的双打的阵列,即,总的I有
db_total_bytes=1000*sizeof(double),...
我可以肯定的说总的GPU使用的全局内存将
int_total_bytes+db_total_bytes?
的感谢!
由于添加了填充以实现最佳地址对齐或最小块大小,有几种情况会使分配的内存实际大小大于计算的大小。
对于您给出的两个示例,数据大小与自然对齐大小和边界兼容,因此您可能看不到计算内存和实际内存之间的差异。不过,如果cudaMalloc使用suballocator - 如果它从OS(或设备)分配一个大块,然后将该大块细分为更小的块以填充cudaMalloc()请求,则可能仍会有一些变化。
如果涉及到suballocator,那么操作系统将显示实际的内存使用量远远大于您的计算使用量,但实际使用情况将保持稳定,即使您的应用程序进行多次小分配(可以从已分配的大块)。
类似地,硬件通常具有通常与存储器页面大小相同的最小分配大小。如果可以从硬件分配的最小内存块是64K,那么当你要求3k时,你已经分配了61K但是没有被使用。这是一个suballocator会很有用的地方,以确保您尽可能多地使用您分配的内存块。
除了dthorpe说的内容,您可以使用nvidia-smi
命令检查进程的GPU内存使用情况。
或在代码中使用[NVML](http://developer.nvidia.com/cuda/nvidia-management-library-nvml)使用'nvmlDeviceGetMemoryInfo'函数。 – 2012-09-20 13:38:05
http://stackoverflow.com/q/8684770/681865,http://stackoverflow.com/q/8905949/681865 – talonmies 2012-08-06 23:51:26