c++ - 在 GPU 上使用 X11 时,XShmGetImage 是否会返回主机/设备内存?
问题描述
如果您在 GPU 上运行 X11,如下所示:
Fri Aug 2 23:52:39 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.30 Driver Version: 430.30 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla M60 Off | 00000000:00:1E.0 Off | 0 |
| N/A 28C P8 14W / 150W | 141MiB / 7618MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 3255 G /usr/lib/xorg/Xorg 57MiB |
| 0 3286 G /usr/bin/gnome-shell 81MiB |
+-----------------------------------------------------------------------------+
如果你运行 XShmGetImage(),它会给你一个指向 GPU 内存或主机内存中的内存地址的指针吗?
如果是 GPU,我假设您可以使用它在 NVIDIA 卡上执行其他操作,例如 H264 编码该数据。
有没有办法将内存从一个 GPU 内存块复制到另一个 GPU 内存块?
我正在使用 NVENC 库。
解决方案
阅读MIT 共享内存扩展的文档:
下一步是创建共享内存段。这最好在创建 XImage 之后完成,因为您需要利用 XImage 中的信息来了解要分配多少内存。要创建细分,您需要如下调用:
shminfo.shmid = shmget(IPC_PRIVATE, image->bytes_per_line * image->height, IPC_CREAT|0777);
这意味着扩展将“共享内存”视为“由shmget
或等效返回的内存”。由于shmget
无法分配 GPU 内存,我的回答是 XImage 在主机内存中,而不是在设备中。