2024-02-11

【LMDE】amdgpu で GPU のパフォーマンスを調整

「艦これ」プレイ中にたまに発生するカクカクを解消するために Radeon RX 6600 を導入したのですが、今回はパフォーマンスの調整についてです。

前回に引き続き、Ryzen 5 5600G の iGPU はすごく楽チンなんだなぁ、という思いが強くなってきました。

さっそく測定

Basemark Web iGPU

 
Basemark Web Radeon 6600

MotionMark iGPU

MotionMark Radeon 6600

ベンチマークの数値はけっこう増加しているのですが、デスクトップの操作感は iGPU と Radeon 6600 であまり違いがわかりませんでした。

GPU の稼働状況 iGPU

GPU の稼働状況 Radeon 6600

 

GPU の稼働状況を確認してみると、iGPU の時は MCLK が 1800MHz、SCLK が 2100MHz という値であったのですが、Radeon 6600 に差し替えると 96MHz でほぼ固定、SCLK に至ってはゼロからちょびちょび変動しています。稀に 100MHz を超えることもある程度です。

GPU 温度も iGPU とそれほど変わらず、使用感も iGPU と同等な感じです。少ないエネルギーで同等の仕事をしているとも言えますが、残念ながらワタシの目的は「艦これ」のカクカクをなくすことなので、これではダメなのです。


調べてみた

Vega 20 以降の世代の Radeon では電源管理の方式が変わっているらしく、自動調整が非常に良くなっているようです。

AMDGPU - Gentoo Wiki

kernel 起動パラメーターに amdgpu.ppfeaturemask を指定することで電源管理機能を調整できるようになります。

/sys/class/drm/card0/device 内に pp_od_clk_voltage というファイルが追加され、その中身を確認するとOD_SCLK と OD_MCLK が表示されますが、それぞれで「0:〜」が最小クロック、「1:〜」が最大クロックを示しています。以前の世代の Radeon では動かしたいクロックを指定する方式であったのですが、新しい世代の Radeon では「範囲」しか指定できなくなっているそうです。

power_dpm_force_performance_level のデフォルト値は「auto」なのですが、ここに「profile_min_sclk」と書き込むと OD_SCLK の 0:〜 のクロックに固定されて動くようになります。

echo profilce_min_sclk > power_dpm_force_performance_level

 

もう一つ、pp_power_profile_mode で動作モードを変える、という方法もあります。こちらはクロックを固定するわけではなく負荷に応じて上下するのですが、いまいち設定内容がわかりません。

$ cat pp_power_profile_mode 
PROFILE_INDEX(NAME) CLOCK_TYPE(NAME) 	FPS		MinFreqType	MinActiveFreqType	MinActiveFreq	BoosterFreqType	BoosterFreq PD_Data_limit_c PD_Data_error_coeff PD_Data_error_rate_coeff
 0 BOOTUP_DEFAULT*:
                    0(       GFXCLK)       0    5       	1       			0       		4     			800		4587520  -65536       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0 		3276800   -6553   -6553
                    2(        MEMLK)       0    5       	1       			0       		4     			800  	327680  -65536       0
 1 3D_FULL_SCREEN :
                    0(       GFXCLK)       0    5       	1       			0       		4     			650 	4587520   -3276  -65536
                    1(       SOCCLK)       0    5       	1       			0       		1       		0  		655360   -6553   -6553
                    2(        MEMLK)       0    5       	4     				850       		4     			800  	327680  -65536       0
 2   POWER_SAVING :
                    0(       GFXCLK)       0    5       	1       			0       		3       		0 		5898240  -65536       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0 		3407872   -6553   -6553
                    2(        MEMLK)       0    5       	1       			0       		3       		0 		1966080  -65536       0
 3          VIDEO :
                    0(       GFXCLK)       0    5       	1       			0       		4     			500 	4587520  -65536       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0 		3473408   -6553   -6553
                    2(        MEMLK)       0    5       	1       			0       		4     			500 	1966080  -65536       0
 4             VR :
                    0(       GFXCLK)       0    5       	4    				1000       		1       		0 		3932160       0       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0  		655360   -6553   -6553
                    2(        MEMLK)       0    5       	1       			0       		4     			800  	327680  -65536       0
 5        COMPUTE :
                    0(       GFXCLK)       0    5       	4    				1000       		1       		0 		3932160       0       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0  		655360   -6553   -6553
                    2(        MEMLK)       0    5       	4     				850       		3       		0  		327680  -65536  -32768
 6         CUSTOM :
                    0(       GFXCLK)       0    5       	1       			0       		4     			800 	4587520  -65536       0
                    1(       SOCCLK)       0    5       	1       			0       		1       		0 		3276800   -6553   -6553
                    2(        MEMLK)       0    5       	1       			0       		4     			800  	327680  -65536       0

プロファイルを切り替えるには、以下のような二段階の操作が必要です。

echo manual > power_dpm_force_performance_level
echo 4 > pp_power_profile_mode

MinActiveFreqType などの項目の説明が探しても見つからないので、とりあえずいろんなモードを試してみて期待通りの動きになるプロファイルを探すのが良さそうです。

あと、面倒なのがサスペンドから復帰するとリセットされてしまう点です。power_dpm_force_performance_level が auto に戻っているので、まったく最初からの設定し直しが必要です。


最終的には

なんと、Radeon RX 6600 を取り外して iGPU に戻りました・・・。

・高クロック設定にしても「艦これ」のカクカクが完全に解消しなかった

そんなにすごく高クロックに設定したわけではないのですが、カクカク度合いは減ったものの完全に解消しませんでした。

・GPU の温度が上がるのがイヤだった

当然と言えば当然なのですが、GPU を高クロックで回すと発熱も増えるので温度も高くなります。カクカクが解消しないのに温度が上がるのに耐えきれませんでした。

・やはり面倒

サスペンドから復帰した際に GPU ファンの回転数を再調整し、GPU のクロック設定も再調整するというのがかなり面倒に感じられました。GPU ファンの回転数も GPU 温度に連動して増減して欲しいのですが、これが固定になってしまうのです。

iGPU は CPU ファンで冷却しているのでこれが自動でなされていて大変楽チンだったことが改めて気付かされました。


というわけで、今はディスプレイのリフレッシュレートを上げてみる、というのを試してみたくてウズウズしているところです。最近のディスプレイはリフレッシュレートが 75Hz というものが多いようで、100Hz というのも数が多いようでした。

とても試してみたいのです。