[英]How to measure precisely the memory usage of the GPU (OpenACC+Managed Memory)
哪个是测量使用 OpenACC 和托管 Memory 的应用程序的 GPU 的 memory 使用的最精确方法? 我使用了两种方法来做到这一点:一种是
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.85.02 Driver Version: 510.85.02 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla v100 ... Off | 00000000:01:00.0 Off | N/A |
| N/A 51C P5 11W / N/A | 10322MiB / 16160MiB | 65% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 2670 G ./myapp 398MiB |
+-----------------------------------------------------------------------------+
关于这里打印的内容,上面的 Memory 用法(10322MiB / 16160MiB)和下面的用法(./myapp 398MiB)有什么区别?
我使用的另一种方法是:
void measure_acc_mem_usage() {
auto dev_ty = acc_get_device_type();
auto dev_mem = acc_get_property(0, dev_ty, acc_property_memory);
auto dev_free_mem = acc_get_property(0, dev_ty, acc_property_free_memory);
auto mem = dev_mem - dev_free_mem;
if (mem > max_mem_usage)
max_mem_usage = mem;
}
A function 我在程序执行过程中多次调用。
这两种方法似乎都没有报告设备的确切行为(此声明基于似乎发生饱和的时间:当应用程序开始运行非常缓慢时会增加问题大小)并报告非常不同的值(例如,第二种方法表示 2GB 的 memory 使用量,nvidia-smi 说 16GB)
不确定在使用 CUDA 统一 Memory(又名托管)时,您能否获得 memory 使用的精确值。 nvidia-smi 实用程序将仅显示 cudaMalloc 分配的 memory 和 OpenACC 属性 function 将使用 cudaGetMemInfo 这对于 UM 不准确。
Bob 很好地解释了为什么在这里: CUDA 统一 memory 页面在 CPU 中访问但未从 GPU
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.