DREAMER

[VPI] VPI란? Basic Concepts 본문

프로그래밍/NVIDIA

[VPI] VPI란? Basic Concepts

연소민 2024. 11. 7. 11:16
728x90
반응형

VPI란?

VPI는 실시간 이미지 처리 어플리케이션에 적합한 비동기 컴퓨팅 파이프라인을 구현하는데 사용됩니다.

파이프라인은 하나 이상의 비동기 컴퓨팅 스트림(1)으로 구성되며, 해당 스트림은 사용 가능한 컴퓨팅 백엔드(2) 버퍼(4)에서 알고리즘(3)을 실행하게 됩니다.

스트림들 간 동기화는 이벤트를 사용하여 이루어집니다.

 

스트림이란?

VPIStream은 주어진 백엔드 장치에서 순차적으로 알고리즘을 실행하는 비동기 큐입니다.

백엔드 간에 높은 수준의 병렬처리를 수행하기 위해, 프로세싱 파이프라인은 여러 processing 단계가 동시에 실행되도록 구성될 수 있으며, 각 단계는 VPI 스트림에서 각각 실행됩니다.

VPI 스트림은 VPI가 제공하는 동기화 기본 요소를 통해 데이터 구조를 교환하여 서로 공동으로 작업할 수 있습니다.

 

백엔드란?

백엔드는 실제로 알고리즘을 돌리는 컴퓨팅 하드웨어로 구성됩니다.

VPI는 백엔드 CPU, GPU (CUDA 사용), PVA (Programmable Vision Accelerator), VIC(Video and Image Compositor) and OFA(Optical Flow Accelerator)를 지원합니다.

CPU - x86(linux)과 Jetson aarch64 플랫폼의 모든 장치
CUDA - Maxwell 이상의 NVIDIA GPU를 탑재한 x86(linux)과 Jetson aarch64 플랫폼의 모든 장치
PVA - 모든 Jetson AGX Orin 및 Jetson Orin NX 장치
VIC - 모든 Jetson 장치
OFA - 모든 Jetson Orin 장치
 

알고리즘이란?

VPI는 스테레오 이미지와 Harris keypoint 검출 간의 시차 계산, 이미지 블러링과 같은 특정 목적의 컴퓨터 비전 알고리즘을 제원합니다.

일부 알고리즘은 프로세싱을 수행하기 위해 VPIPaylod라고 하는 임시 버퍼를 사용합니다.

Payload는 한번 생성될 수 있고, 후에 알고리즘이 스트림에 submit 될 때마다 재사용될 수 있습니다.
종종 payload는 주어진 input size로 생성되며, 이 경우에 payload는 다른 input size에는 재사용될 수 없습니다.
 
데이터 버퍼란?
VPI는 데이터를 작업하는 각 알고리즘의 버퍼에 캡슐화합니다.
VPI는 2D 이미지, 1D 데이터 어레이 및 2D 이미지 피라미드에 대한 추상화를 제공합니다.
VPI는 이러한 추상화를 할당하고 관리할 수 있습니다.
또한 이미지 및 어레이의 경우 VPI는 외부에 할당된 메모리를 랩하여 알고리즘이 직접 사용할 수 있습니다.
두 경우 모두 VPI는 타겟 백엔드에 제로 카피(공유) 메모리 매핑을 통해 높은 처리량을 달성하려고 시도합니다.
일반적으로 정렬 문제 또는 기타 메모리 특성으로 인해 VPI가 제로 카피 메모리 매핑을 사용할 수 없는 경우, 필요에 따라 심층 메모리 복사를 원활하게 수행합니다.

2D 이미지

VPI는 지정된 너비, 높이 및 이미지 형식의 메모리 블록 하나로 2D 이미지를 나타냅니다.
구성 중에 2D 이미지의 이미지 크기와 형식이 정의되면 변경할 수 없습니다.

1D 어레이

VPI 1D 어레이는 기본적으로 주어진 유형과 용량의 메모리 선형 블록입니다.
용량은 어레이의 유형에 따라 결정되는 단위로 측정됩니다.
이미지와 달리 어레이의 크기는 시간이 지남에 따라 달라질 수 있지만 어레이의 용량을 초과해서는 안 됩니다.

 

 

2D 이미지 피라미드

피라미드는 동일한 형식의 2D 이미지 모음입니다. 이미지 피라미드는 다음과 같이 정의됩니다:

미세한 수준부터 거친 수준까지
최고급 레벨의 너비와 높이
한 레벨에서 다음 레벨로의 확장
이미지 형식

사용자 지정 메모리 래핑

사용자 응용 프로그램에 VPI 알고리즘에 대한 입력 및/또는 출력 버퍼 역할을 해야 하는 기존 메모리 버퍼가 있는 경우, 이를 VPI 이미지 또는 VPIray로 감쌀 수 있습니다.
예를 들어 메인 루프가 카메라 장치에서 프레임을 가져와 VPI 처리 파이프라인에 입력하는 경우가 이 경우입니다.
프레임 특성에 따라 이 메모리 블록은 메모리 사본 없이 VPI에서 사용됩니다.
이는 제로 카피 메모리 매핑의 또 다른 인스턴스입니다.

사용자가 할당한 랩핑된 메모리는 가능한 경우 피해야 하며, 특히 일련의 알고리즘 호출에 임시 버퍼를 사용하는 경우에는 더욱 그렇습니다.
대신 사용자 VPI가 할당한 버퍼를 사용하는 것이 좋습니다.
제로 카피 매핑이 발생할 가능성이 높아져 파이프라인 성능이 향상됩니다.
 

동기화 기본 요소

VPI는 서로 다른 스트림 간의 작업을 조정하고 작업이 올바른 순서로 실행되도록 하는 몇 가지 방법을 제공합니다

주어진 스트림을 호출 스레드에 동기화하여 지금까지 스트림에 제출된 모든 작업이 완료될 때까지 호출 스레드를 기다리게 할 수 있습니다.
애플리케이션은 최종 결과를 검사하거나 시각화와 같은 다른 단계로 전달할 수 있습니다.
스트림 간에 보다 세분화된 조정을 위해 VPIevent를 사용하여 하나 이상의 스트림 또는 호출 스레드에서 특정 작업이 완료될 때까지 대기하여 장벽 동기화 메커니즘을 효과적으로 구현할 수 있습니다.


VPI 애플리케이션

VPI 애플리케이션은 크게 세 단계로 구성됩니다:
- 초기화

메모리가 할당되는 초기화에서는 스트림, 이미지, 어레이, 컨텍스트와 같은 VPI 개체가 생성되고 설정과 같은 기타 일회성 초기화 작업이 수행됩니다.
- Processing Loop
외부 데이터가 VPI에서 사용하도록 랩핑되는 처리 루프입니다. 응용 프로그램은 대부분의 시간을 이 단계에서 보냅니다.
처리 루프는 초기화 중에 생성된 페이로드를 스트림에 제출합니다.

결과를 읽고 다른 단계로 전달하여 추가 처리 또는 시각화합니다.

 

- Cleanup

초기화 중에 할당된 모든 개체가 파괴됩니다.

 

 

출처: https://docs.nvidia.com/vpi/basic_concepts.html

728x90
반응형

'프로그래밍 > NVIDIA' 카테고리의 다른 글

[VPI] GstSample -> VPIImage 변환  (0) 2024.10.08
[Yocto] meta-tegra initrd로 플래시  (0) 2024.04.25
[Jetson Nano] Boot Process  (0) 2024.02.21
[Orin NX] Compatible Carrier Board  (0) 2024.02.06
[L4T] Release Notes  (0) 2024.02.06
Comments