Virtualbox 및 GPU 채널: 호스트 PCI 주소가 이 가상 머신의 장치에 연결됩니다.

Virtualbox 및 GPU 채널: 호스트 PCI 주소가 이 가상 머신의 장치에 연결됩니다.

내 서버에는 여러 개의 GPU가 있습니다. 내 생각은 CUDA(또는 OpenCL) 계산에서 사용하기 위해 이를 다른 가상 머신에 연결하는 것입니다.

내 설정:

  1. CPU: 인텔 제온 E5-2670
  2. GPU:

    • 1 라데온 HD 7970

      $ lspci -nn | grep Rad
        83:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X] [1002:6798]
        83:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti XT HDMI Audio [Radeon HD 7970 Series] [1002:aaa0]
      
    • 2 지포스 GTX 타이탄 블랙

  3. 리눅스 커널 3.14.6
  4. 버추얼박스 버전 4.3.28_OSEr100309

어떤 GPU에도 연결할 수 있기를 원하지만 Radeon부터 시작하겠습니다.

여러 가이드를 찾았습니다. 가장 유용한 것은 Arch Wiki에서 가져온 것입니다.OVMF를 통한 PCI 패스스루.

BIOS에서 VT-D를 활성화했습니다.

$ grep 'vmx|svm|0xc0f' /proc/cpuinfo
flags           : ... vme ... vmx ...

IOMMU를 활성화했습니다:

$ dmesg|grep -e DMAR -e IOMMU
[    0.000000] Intel-IOMMU: enabled
[    0.089689] dmar: IOMMU 0: reg_base_addr fbffe000 ver 1:0 cap d2078c106f0462 ecap f020fe
[    0.089698] dmar: IOMMU 1: reg_base_addr ebffc000 ver 1:0 cap d2078c106f0462 ecap f020fe
[    0.089833] IOAPIC id 2 under DRHD base  0xfbffe000 IOMMU 0
[    0.089835] IOAPIC id 0 under DRHD base  0xebffc000 IOMMU 1
[    0.089836] IOAPIC id 1 under DRHD base  0xebffc000 IOMMU 1
[    1.440173] IOMMU 0 0xfbffe000: using Queued invalidation
[    1.440176] IOMMU 1 0xebffc000: using Queued invalidation
[    1.440191] IOMMU: Setting RMRR:
[    1.440241] IOMMU: Setting identity map for device 0000:00:1d.0 [0xbddbf000 - 0xbddd5fff]
[    1.440332] IOMMU: Setting identity map for device 0000:00:1a.0 [0xbddbf000 - 0xbddd5fff]
[    1.440375] IOMMU: Prepare 0-16MiB unity mapping for LPC
[    1.440413] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
[    5.356692] vboxpci: IOMMU found

GPU 분리그리고 pci-stub:

$ dmesg | grep pci-stub
[    0.000000] Command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda1 ro nomodeset intel_iommu=on pci-stub.ids=1002:6798,1002:aaa0 initrd=../initramfs-linux.img
[    0.000000] Kernel command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda1 ro nomodeset intel_iommu=on pci-stub.ids=1002:6798,1002:aaa0 initrd=../initramfs-linux.img
[    1.544921] pci-stub: add 1002:6798 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.545003] pci-stub 0000:83:00.0: claimed by stub
[    1.545107] pci-stub: add 1002:AAA0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.545186] pci-stub 0000:83:00.1: claimed by stub

그리고블랙리스트에 등록된 모듈그리고 fglrx시작 후에는 로드되지 않습니다.

$ cat /etc/modprobe.d/blacklist-fglrx.conf
blacklist radeon
blacklist fglrx

이 pci에 연결하려고 하면 다음 오류가 발생합니다.

VBoxManage: error: Device with host PCI address already attached to this VM
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "AttachHostPCIDevice(iHostAddr, iGuestAddr, TRUE)" at line 2736 of file VBoxManageModifyVM.cpp

가능한 원인은 IOMMU 그룹에 있습니다(GPU의 오디오 및 비디오 부분이 하나의 그룹이므로).

$ find /sys/kernel/iommu_groups/ -type l | grep 22
/sys/kernel/iommu_groups/22/devices/0000:83:00.0
/sys/kernel/iommu_groups/22/devices/0000:83:00.1

그런데 전체 그룹을 한 번에 연결하는 방법을 모르겠습니다.

어떤 아이디어가 있나요?

추신: 특정 VM에 갇혀 있지 않습니다. VirtualBox 대신 다른 것을 사용할 수 있다면 기쁠 것입니다.

관련 정보