我使用 cudaMalloc 分配大小为 100 的整数数组,即我拥有的总数
int_total_bytes=100*sizeof(int),
并分配大小为 1000 的双精度数组,即我有
db_total_bytes=1000*sizeof(double),...
我可以确定 gpu 上使用的全局内存总量是
int_total_bytes+db_total_bytes?
谢谢!
我使用 cudaMalloc 分配大小为 100 的整数数组,即我拥有的总数
int_total_bytes=100*sizeof(int),
并分配大小为 1000 的双精度数组,即我有
db_total_bytes=1000*sizeof(double),...
我可以确定 gpu 上使用的全局内存总量是
int_total_bytes+db_total_bytes?
谢谢!
由于添加填充以实现最佳地址对齐或由于最小块大小,有几种情况可能使分配的实际内存大小大于计算大小。
对于您给出的两个示例,数据大小与自然对齐大小和边界兼容,因此您可能不会看到计算内存和实际使用的内存之间有太大差异。但是,如果 cudaMalloc 使用子分配器,可能仍然存在一些变化 - 如果它从操作系统(或设备)分配一个大块,然后将该大块细分为较小的块以填充 cudaMalloc() 请求。
如果涉及到子分配器,那么操作系统将显示实际内存使用量比您计算的使用量大得多,但即使您的应用程序进行多次小分配(可以从已经分配的大块中填充),实际使用量仍将保持稳定。
类似地,硬件通常具有通常与内存页面大小相同的最小分配大小。如果可以从硬件分配的最小内存块是 64K,那么当您要求 3k 时,您得到的 61K 已分配但未使用。这是子分配器有用的地方,以确保您尽可能多地使用您分配的内存块。
除了 dthorpe 所说的之外,您还可以使用nvidia-smi
命令检查进程的 GPU 内存使用情况。