首页 > 解决方案 > 在 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 库。

标签: c++linuxx11nvidiagnome

解决方案


阅读MIT 共享内存扩展的文档:

下一步是创建共享内存段。这最好在创建 XImage 之后完成,因为您需要利用 XImage 中的信息来了解要分配多少内存。要创建细分,您需要如下调用:

shminfo.shmid = shmget(IPC_PRIVATE, image->bytes_per_line * image->height, IPC_CREAT|0777);

这意味着扩展将“共享内存”视为“由shmget或等效返回的内存”。由于shmget无法分配 GPU 内存我的回答是 XImage 在主机内存中,而不是在设备中。


推荐阅读