virtio-nvgpu ํ๋ก์ ํธ๋ KVM ํ์ดํผ๋ฐ์ด์ ์์ ์คํ๋๋ ๊ฒ์คํธ ์์คํ ์์ NVIDIA GPU์ ์ต์ํ์ ์ฑ๋ฅ ์ ํ๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๋ virtio ์ฅ์น๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ ๊ฒ์คํธ ์์คํ ์ ๋ก๋๋๋ ์ปค๋ ๋ชจ๋๊ณผ ํธ์คํธ์์ ์คํ๋๋ virtio ์ฅ์น๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ปค๋ ๋ชจ๋ ์ฝ๋๋ C ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ GPLv2 ๋ผ์ด์ ์ค๊ฐ ์ ์ฉ๋๊ณ , virtio ์ฅ์น ์ฝ๋๋ Rust ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ Apache 2.0 ๋ผ์ด์ ์ค๊ฐ ์ ์ฉ๋ฉ๋๋ค.
๊ฐ๋ฐ์๋ค์ ๋ฐ๋ฅด๋ฉด GPU ์ ๊ทผ ์ ์ฑ๋ฅ ์ ํ๋ 2%๋ฅผ ๋์ง ์์ต๋๋ค. ๋์ ์ฑ๋ฅ์ ioctl ํธ์ถ์ ๋ค์ดํฐ๋ธ NVIDIA ๋๋ผ์ด๋ฒ๋ก ๋ฆฌ๋๋ ์ ํ๊ณ API ์์ค์์ ์์ฒญ์ ๋ณํํ์ง ์๊ณ NVIDIA ๋๋ผ์ด๋ฒ ABI ์์ค์์ ์๋ํจ์ผ๋ก์จ ๋ฌ์ฑ๋ฉ๋๋ค. ๊ฒ์คํธ ์ธก์์๋ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์คํ๋๋ ๊ณ ์์ค NVIDIA ๋๋ผ์ด๋ฒ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฒ์คํธ ์์คํ ์ ์ปค๋ ๋ชจ๋์ด ๋ก๋๋ฉ๋๋ค. ์ด ๋ชจ๋์ /dev/nvidiactl, /dev/nvidia0โฆN ๋ฐ /dev/nvidia-uvm ์ฅ์น ํ์ผ์ ์ ๊ณตํ๊ณ ioctl() ๋ฐ mmap() ํธ์ถ์ ๊ฐ์ ํ(virtqueue)๋ฅผ ํตํด ํธ์คํธ ํ๊ฒฝ์ ํธ๋ค๋ฌ๋ก ์ ๋ฌํ๋ฉฐ, ํธ๋ค๋ฌ๋ ์ด๋ฅผ NVIDIA ํธ์คํธ ๋๋ผ์ด๋ฒ๋ก ์ ๋ฌํฉ๋๋ค. ํธ์คํธ ์์คํ ๊ณผ ๊ฐ์ ๋จธ์ ๊ฐ์ ์ปจํ ์คํธ ์ ํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ช ๋ น ๋ฒํผ๋ ํธ์คํธ ํ๊ฒฝ๊ณผ GPU์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ(mmapping)๋ฉ๋๋ค.
VFIO ํจ์ค์ค๋ฃจ(VFIO Passthrough)์ ๊ฐ์ ๋ ์ ์ ์ธ GPU ์ก์ธ์ค ํจ์ค์ค๋ฃจ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, virtio-nvgpu ํ๋ก์ ํธ๋ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ํ๋์ GPU์ ๋ํ ๊ณต์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ ๊ธฐ๊ธฐvirtio-nvgpu๋ virtio-gpu(Venus, VirGL)์ ๋ฌ๋ฆฌ Vulkan ๋ฐ OpenGL ๊ทธ๋ํฝ API ๋ณํ ์์ค์ด ์๋ NVIDIA ๋๋ผ์ด๋ฒ์ ๋ํ ABI ํจ์ค์ค๋ฃจ๋ฅผ ํตํด ์๋ํฉ๋๋ค. virtio-nvgpu์ ๋จ์ ์ผ๋ก๋ ์์ ํ IOMMU ๊ธฐ๋ฐ ๊ฒฉ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ ์ (๊ฒ์คํธ ์์คํ ์ NVIDIA ํธ์คํธ ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์๋ํ๋ฉฐ ioctl ํธ์ถ ํํฐ๋ง์ผ๋ก ์ ํ๋จ)๊ณผ NVIDIA ๋๋ผ์ด๋ฒ ABI์ ์์กดํ๋ค๋ ์ (ABI๋ ๋ฒ์ ๋ง๋ค ๋ณ๊ฒฝ๋๋ฏ๋ก virtio-nvgpu๋ ์ด์ ๋ง์ถฐ ์์ ํด์ผ ํจ)์ด ์์ต๋๋ค.
virtio-nvgpu๋ Vulkan, OpenGL, NVENC ๋ฐ CUDA API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง, ๋น๋์ค ์ธ์ฝ๋ฉ ๋ฐ ์ปดํจํ
์ ์ํํ๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ์ฃผ์ ์์ฉ ๋ถ์ผ๋ก๋ ํด๋ผ์ฐ๋ ๊ฒ์ ์๋น์ค ๋๋ ๊ฒ์์ด๋ ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ๊ฐ์ ๋ฐ์คํฌํฑ ํ๊ฒฝ ๊ตฌ์ถ์ด ์์ต๋๋ค. ๊ฐ์ ๊ธฐ๊ธฐ์ด ์์คํ
์ ๋ ๋๋ง, NVENC๋ฅผ ์ฌ์ฉํ ํ๋์จ์ด ์ธ์ฝ๋ฉ, ๊ทธ๋ฆฌ๊ณ ์์ถ๋ ๋น๋์ค ์คํธ๋ฆผ ํํ๋ก ์ถ๋ ฅ์ ์๊ฒฉ ์ฌ์ฉ์์๊ฒ ์ ์กํ๋ ์์
์ ์ํํฉ๋๋ค.
์ถ์ฒ : opennet.ru
