GPU device selection#
This article describes how to select a GPU device on a multi-GPU system.
1. Inference (OpenVINO™ based) elements#
Explicit selection#
In case of video decoding running on CPU and inference running on GPU, the
device property in inference elements enables you to select the GPU device
according to the
OpenVINO™ GPU device naming convention
, with devices enumerated as GPU.0, GPU.1, etc., for example:
gst-launch-1.0 "... ! decodebin3 ! gvadetect device=GPU.1 ! ..."
2. Media and Inference elements#
GStreamer allows selecting the GPU render device for VA codec plugins when more than one GPU is available in the system.
On single-GPU systems, VA codec plugin elements such as vah264dec and
vapostproc map to the /dev/dri/renderD128 GPU device (GPU.0).
On multi-GPU systems, each additional GPU corresponds to a separate DRI device, for example:
/dev/dri/renderD129for GPU.1/dev/dri/renderD130for GPU.2
Sample list of available VA codec plugins on a multi-GPU system:
gst-inspect-1.0 | grep va
. . .
va: vah264dec: VA-API H.264 Decoder in Intel(R) Gen Graphics
va: vapostproc: VA-API Video Postprocessor in Intel(R) Gen Graphics
. . .
va: varenderD129h264dec: VA-API H.264 Decoder in Intel(R) Gen Graphics in renderD129
va: varenderD129postproc: VA-API Video Postprocessor in Intel(R) Gen Graphics in renderD129
. . .
va: varenderD130h265dec: VA-API H.265 Decoder in Intel(R) Gen Graphics in renderD130
va: varenderD130postproc: VA-API Video Postprocessor in Intel(R) Gen Graphics in renderD130
Example of selecting the corresponding VA codec elements (vah264dec,
vapostproc) on a single-GPU system:
gst-launch-1.0 filesrc location=${VIDEO_FILE} ! parsebin ! vah264dec ! vapostproc ! "video/x-raw(memory:VAMemory)" ! \
gvadetect model=${MODEL_FILE} device=GPU.0 pre-process-backend=va-surface-sharing batch_size=8 ! queue ! gvafpscounter ! fakesink
For GPU devices other than the default one (GPU or GPU.0), it is highly recommended to select the matching VA codec elements.
varenderD129h264dec,varenderD129postprocfor GPU.1varenderD130h264dec,varenderD130postprocfor GPU.2, and so on
Example of selecting VA codec elements (varenderD129h264dec,
varenderD129postproc) on a multi-GPU system for GPU.1:
gst-launch-1.0 filesrc location=${VIDEO_FILE} ! parsebin ! varenderD129h264dec ! varenderD129postproc ! "video/x-raw(memory:VAMemory)" ! \
gvadetect model=${MODEL_FILE} device=GPU.1 pre-process-backend=va-surface-sharing batch_size=8 ! queue ! gvafpscounter ! fakesink
NOTE: Starting with GStreamer 1.24.12 and DLS 2025.0.1.2, using
decodebin3instead ofdecodebinis strongly recommended for the primary GPU (GPU.0).decodebin3simplifies the pipeline layout. The sequenceparsebin ! vah264dec ! vapostproc ! "video/x-raw(memory:VAMemory)"can be replaced with a singledecodebin3element.
gst-launch-1.0 filesrc location=${VIDEO_FILE} ! decodebin3 ! \
gvadetect model=${MODEL_FILE} device=GPU pre-process-backend=va-surface-sharing ! queue ! gvafpscounter ! fakesink
NOTE: From GStreamer 1.24 and DLS 2024.1.0, the VAAPI plugin is deprecated. The
GST_VAAPI_ALL_DRIVERSenvironment variable is deprecated in favor ofGST_VA_ALL_DRIVERS. If you need to use the legacy VAAPI plugin (which will be removed in GStreamer 1.28), VAAPI elements should be used directly (e.g.,vaapih264decinstead ofdecodebin). Use the GST_VAAPI_DRM_DEVICE environment variable to set the decoding device.