AMD Ryzen 7 255 /w Radeon 780M Graphics のGPUでOpenCV処理の時間計測をWindowsとWSLで行いましたが、WSLではGPUが認識出来ていませんでした。ROCDXGが更新されていたので、その追試を行いました。#自分の忘備録18
WSLで「Radeon 780M Graphics」も使えそうだ ← WSLのOpenCVで AMD GPU「Radeon 780M Graphics ですが」使えるのか・・・
AMD GPUをWSLで使用できるようにするために ROCmとROCDXGを使います。
- ドキュメント(WSL How to guide - Use ROCm on Radeon)を参考にします。
- Adrenalin 26.2.2 + ROCm 7.2.1でROCDXGを導入する記事になっていますが、最新のAdrenalin 26.5.1に更新されているのでそのまま進めます。
- Adrenalin 26.5.1は何かへん?で、GUIが勝手に起動するバグがあるようなので、ドライバー以外はアンインストールしています。
- AMD ROCDXG Libary の手順でセッティングします。
(ROCDXGの更新を取得して構築)
cd librocdxg
git pull origin develop
cd build
make
sudo make install
わ~ぉ~、以下のrocminfoの出力Agent 2に「AMD Radeon 780M Graphics」が認識されていました。
すばらし~い(^O^)
(チェック)
export HSA_ENABLE_DXG_DETECTION=1
rocminfo (出力は以下の通り、出力行の1文字目に#を追加)
#WSL environment detected.
#=====================
#HSA System Attributes
#=====================
#Runtime Version: 1.18
#Runtime Ext Version: 1.15
#System Timestamp Freq.: 1000.000000MHz
#Sig. Max Wait Duration: 18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
#Machine Model: LARGE
#System Endianness: LITTLE
#Mwaitx: DISABLED
#XNACK enabled: NO
#DMAbuf Support: YES
#VMM Support: YES
#
#==========
#HSA Agents
#==========
#*******
#Agent 1
#*******
# Name: AMD Ryzen 7 255 w/ Radeon 780M Graphics
# Uuid: CPU-XX
# Marketing Name: AMD Ryzen 7 255 w/ Radeon 780M Graphics
# Vendor Name: CPU
# Feature: None specified
# Profile: FULL_PROFILE
# Float Round Mode: NEAR
# Max Queue Number: 0(0x0)
# Queue Min Size: 0(0x0)
# Queue Max Size: 0(0x0)
# Queue Type: MULTI
# Node: 0
# Device Type: CPU
# Cache Info:
# L1: 32768(0x8000) KB
# Chip ID: 0(0x0)
# Cacheline Size: 64(0x40)
# BDFID: 0
# Internal Node ID: 0
# Compute Unit: 16
# SIMDs per CU: 0
# Shader Engines: 0
# Shader Arrs. per Eng.: 0
# Memory Properties:
# Features: None
# Pool Info:
# Pool 1
# Segment: GLOBAL; FLAGS: FINE GRAINED
# Size: 24496316(0x175c8bc) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:4KB
# Alloc Alignment: 4KB
# Accessible by all: TRUE
# Pool 2
# Segment: GLOBAL; FLAGS: EXTENDED FINE GRAINED
# Size: 24496316(0x175c8bc) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:4KB
# Alloc Alignment: 4KB
# Accessible by all: TRUE
# Pool 3
# Segment: GLOBAL; FLAGS: KERNARG, FINE GRAINED
# Size: 24496316(0x175c8bc) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:4KB
# Alloc Alignment: 4KB
# Accessible by all: TRUE
# Pool 4
# Segment: GLOBAL; FLAGS: COARSE GRAINED
# Size: 24496316(0x175c8bc) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:4KB
# Alloc Alignment: 4KB
# Accessible by all: TRUE
# ISA Info:
#*******
#Agent 2
#*******
# Name: gfx1103
# Uuid: GPU-1e7eb746d5234077
# Marketing Name: AMD Radeon 780M Graphics
# Vendor Name: AMD
# Feature: KERNEL_DISPATCH
# Profile: BASE_PROFILE
# Float Round Mode: NEAR
# Max Queue Number: 128(0x80)
# Queue Min Size: 64(0x40)
# Queue Max Size: 131072(0x20000)
# Queue Type: MULTI
# Node: 1
# Device Type: GPU
# Cache Info:
# L1: 32(0x20) KB
# L2: 2048(0x800) KB
# Chip ID: 6400(0x1900)
# Cacheline Size: 64(0x40)
# Max Clock Freq. (MHz): 2600
# BDFID: 50432
# Internal Node ID: 1
# Compute Unit: 12
# SIMDs per CU: 2
# Shader Engines: 1
# Shader Arrs. per Eng.: 2
# Coherent Host Access: FALSE
# Memory Properties:
# Features: KERNEL_DISPATCH
# Fast F16 Operation: TRUE
# Wavefront Size: 32(0x20)
# Workgroup Max Size: 1024(0x400)
# Workgroup Max Size per Dimension:
# x 1024(0x400)
# y 1024(0x400)
# z 1024(0x400)
# Max Waves Per CU: 32(0x20)
# Max Work-item Per CU: 1024(0x400)
# Grid Max Size: 4294967295(0xffffffff)
# Grid Max Size per Dimension:
# x 2147483647(0x7fffffff)
# y 65535(0xffff)
# z 65535(0xffff)
# Max fbarriers/Workgrp: 32
# Packet Processor uCode:: 68
# SDMA engine uCode:: 23
# IOMMU Support:: None
# Pool Info:
# Pool 1
# Segment: GLOBAL; FLAGS: COARSE GRAINED
# Size: 41737806(0x27cde4e) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:2048KB
# Alloc Alignment: 4KB
# Accessible by all: FALSE
# Pool 2
# Segment: GLOBAL; FLAGS: EXTENDED FINE GRAINED
# Size: 41737806(0x27cde4e) KB
# Allocatable: TRUE
# Alloc Granule: 4KB
# Alloc Recommended Granule:2048KB
# Alloc Alignment: 4KB
# Accessible by all: FALSE
# Pool 3
# Segment: GROUP
# Size: 64(0x40) KB
# Allocatable: FALSE
# Alloc Granule: 0KB
# Alloc Recommended Granule:0KB
# Alloc Alignment: 0KB
# Accessible by all: FALSE
# ISA Info:
# ISA 1
# Name: amdgcn-amd-amdhsa--gfx1103
# Machine Models: HSA_MACHINE_MODEL_LARGE
# Profiles: HSA_PROFILE_BASE
# Default Rounding Mode: NEAR
# Default Rounding Mode: NEAR
# Fast f16: TRUE
# Workgroup Max Size: 1024(0x400)
# Workgroup Max Size per Dimension:
# x 1024(0x400)
# y 1024(0x400)
# z 1024(0x400)
# Grid Max Size: 4294967295(0xffffffff)
# Grid Max Size per Dimension:
# x 2147483647(0x7fffffff)
# y 65535(0xffff)
# z 65535(0xffff)
# FBarrier Max Size: 32
# ISA 2
# Name: amdgcn-amd-amdhsa--gfx11-generic
# Machine Models: HSA_MACHINE_MODEL_LARGE
# Profiles: HSA_PROFILE_BASE
# Default Rounding Mode: NEAR
# Default Rounding Mode: NEAR
# Fast f16: TRUE
# Workgroup Max Size: 1024(0x400)
# Workgroup Max Size per Dimension:
# x 1024(0x400)
# y 1024(0x400)
# z 1024(0x400)
# Grid Max Size: 4294967295(0xffffffff)
# Grid Max Size per Dimension:
# x 2147483647(0x7fffffff)
# y 65535(0xffff)
# z 65535(0xffff)
# FBarrier Max Size: 32
#*** Done ***
WSLのOpenCV処理時間計測
AMD GPU OpenCV処理時間計測 と同じことを再度WSLでも行いました。
計測画像の入力にはUSBカメラを使用していたので、WSLでUSBカメラを認識させる手順を以下に示します(前回はGPUを認識していなかったので端折っていました)。
WSLでUSBカメラの使用
準備としてWSL側およびWindows側で必要なモジュールをインストールして、USBカメラ(C270)の存在を確認します。
USBカメラ(C270)はWSL側では見えませんが、Windows側ではBUSID 7-3に見えています。
(WSL側)
sudo apt install usbutils
lsusb ← WSL側にはUSBカメラが見えない
#Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
#Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
(Windows側)
winget install usbipd
usbipd list
#Connected:
#BUSID VID:PID DEVICE STATE
#7-3 046d:0825 Logi C270 HD WebCam Not shared ← Windows側でUSBカメラが見えている(他のデバイスは省略)
Windows側の操作でWSL側でUSBカメラが見えるようにする(WSLは起動した状態で行う)。
(Windows側)
usbipd bind --busid 7-3 (バインドは管理者で実行が必要)
usbipd list
#Connected:
#BUSID VID:PID DEVICE STATE
#7-3 046d:0825 Logi C270 HD WebCam Shared ← バインドするとSharedになる
usbipd attach --wsl --busid 7-3
usbipd list
Connected:
#BUSID VID:PID DEVICE STATE
#7-3 046d:0825 Logi C270 HD WebCam Attached ← アタッチするとAttachedになりWindows側からは使えなくなる
(WSL側)
lsusb
#Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
#Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270 ← WSL側でUSBカメラが見えるようになる
#Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
(再)AMD GPU OpenCV処理時間計測
下表の内容説明
- 1回目だけの計測値は紛らわしいので端折りました
- 処理画像の大きさはUSBカメラの画素数(640×480)
- 数値は2~10回目の処理時間の平均値で、単位は全て[us]
- cv::Matを使用したときはcpu、cv::UMatを使用したときはgpuと表現
- OpenCV構築と計測プログラム構築はReleaseビルド
WSL計測値
| func | cpu | gpu |
|---|---|---|
| image_resize | 71 | 6 |
| scaleabsolute | 93 | 4 |
| gamma_correct | 90 | 389 |
| histgram_equalize | 113 | 9 |
| color_space | 80 | 7 |
| gaussian_blur | 153 | 1736 |
| filter_sharping | 246 | 10 |
Windows計測値
| func | cpu | gpu |
|---|---|---|
| image_resize | 75 | 5 |
| scaleabsolute | 108 | 6 |
| gamma_correct | 156 | 324 |
| histgram_equalize | 204 | 17 |
| color_space | 177 | 5 |
| gaussian_blur | 127 | 872 |
| filter_sharping | 296 | 20 |
- CPUはWSLが若干速そうなものもあるが、GPUはWSLとWindowsは同等
- gamma_correctとgaussian_blurがCPUよりGPUが遅くなる傾向もWindowsとWSLで同等
GPU(Radeon 780M Graphics)を、WSLでもWindowsと同じように使えることがわかりました。