ラズベリーパイのCPUクロックと電圧をいじってみる

Raspberry piでミュージックプレーヤー 10

ここまでMPDパッケージを替えたり、OSやMPDの設定を変えたり、カーネルを替えてI2S出力の動作を変えたりしてきましたが、MPDパッケージで規定された項目以外はラズパイそのものの動作には手を出していませんでした。
もっとも、ラズパイ自体の動作を弄ったところで、スレーブモードI2S出力を使っている分には、外部クロックを受けてそれに合わせてデータを出しているだけのため、何らか変化が起きる訳がない「はず」ですが、同じ機能で同じファイルを再生しているのにもかかわらず、LightMPD、Volumio、MoodeとMPDのパッケージを変えただけで音が変わって聞こえるという、これまたデジタルドメインな方からは信じていただけそうにないことも実感としてあり、この際弄れるものは弄ってみようという興味本位な実験です。

ここらへんに手を出すという事は、一般的なPCでいうところのBIOSにあたる設定を弄ることになるのですが、ラズベリーパイは組み込み用のコンピュータなので、BIOS(EFI)がありません。
どうするかというと、しかるべき設定を書いたしかるべきファイルをしかるべき場所に置いておけばブートローダが読み込んでしかるべき状態で動作してくれることになっています。(OS起動後に変更可能な機能もあります。)

今回対象となる、しかるべきファイルは
/boot/config.txt
です。

ちなみに、この手のボードコンピュータを弄り慣れている方にとっては「何を今さら、だいたい順番逆だろ」といった低レベルな話だと思いますが、ボードコンピュータの使い方としての音声出力からI2Sに向かったのではなく、オーディオヲタクがDACに入力するI2Sをコンピュータから直に取り出すのにラズパイとMPDパッケージを使うという方向から入っていることと、Linux/ラズパイがメインのブログでもないので、ひらにご容赦ください。

何を弄る?

ラズパイ自体の動作で弄りたい項目といえば、ズバリ、動作クロック電圧です。

クロック周波数を変えると単位時間当たりの計算能力が変化するのでCPUの負荷としては変化しますが、負荷が100%を超えない限りはトータルの計算量自体に変化はありません
クロック周波数を変えると目に見えて変化するのは消費電力で、周波数が高くなると、増加する計算能力に対応するため、多くの電力が要求されます。
また、電圧を上げると流れる電流も増えて、消費電力も増えます。
CPUで消費される電力の行き場は「信号出力」「」「ノイズ(電磁放射)」です。
このため、同じ計算量ならより消費電力を小さくした方が熱もノイズも小さくできるので、オーディオ装置的にはそちらの方がよかろうと、クロック周波数、電圧ともに下げる方向のチューニングをされている方もいらっしゃいます。
一方、クロックダウンするとCPUの仕事が遅くなり、CPUビジーの時間が長くなってウエイト(待ち時間)が増えることや、動作電圧を下げると動作が不安定になるので、クロックも電圧も熱的に問題ない範囲で上げた方がウエイトが短く動作が安定する(確実性が高くなる)ことから、こちらの方がオーディオとしてもよかろうと、クロック周波数、電圧ともに上げる方向のチューニングをされている方もいらっしゃいます。

果たして、変化は感じられるのか、また、どう変化するのか。

私が使っているRaspberry pi3 MODEL Bは、スペックとしては64bit/1.2GHz/4コア/1GBメモリーですが、実際には通常時は600MHz負荷が上がると1.2GHzに切り替わるという動作をします。
MoodeAudio3.6で確認したところ、600MHzと1.2GHzが時々切り替わっていることも確認できました。
このクロック切り替わり時にウエイトが入り、演算上のレイテンシが増えることがわかっていますので、まずはこの切り替わりを止めてみます。
また、今回はオーバークロックが目的ではありませんが、電圧もいじります。
(設定によっては電圧も勝手に変わってしまいます。)

config.txtの参考資料はこちらです。
https://www.raspberrypi.org/documentation/configuration/config-txt/overclocking.md

CPUクロックは

arm_freq=(最大周波数MHz)
arm_freq_min=(最低周波数MHz)

で指定します。

CPU電圧は

over_voltage=(-16~8の整数、0で1.2V、25mVステップ)

で指定します。

標準から外れた値を指定したいときやCPUが暇になってもクロックダウンさせたくないときは

force_turbo=1

を追記しますが、この1行だけでも

arm_freq=1200
arm_freq_min=1200
over_voltage=6

と同じ意味合いを持ちます。(Pi3の場合)

別の方法として、cpufrequtilというユーティリティを使い、
/etc/init.d/cpufrequtils
の中で設定を

GOVERNOR=”performance”

にすると、こちらも

arm_freq=1200
arm_freq_min=1200
over_voltage=6

と同じになります。(Pi3の場合)

なお、cpufrequtilは、MoodeAudioにはデフォルトで導入されているようですが、Volume、LightMPDには入っていません。
また、チップ温度が85度になると設定に関わらずクロック、電圧ともにダウンするのがマシンの仕様のようです。

LightMPDで設定してみる。

LightMPDで、変更なし、1.2GHz固定、600MHz固定を作ってみます。
(LightMPDのconfig.txtはSDカードの最上位ディレクトリにあります。)

まずは1.2GHz指定です。
ファイルの冒頭部分

kernel=/boot/zImage
initramfs /boot/initrd.romfs.gz 0x02000000
#
以下略

となっているところを

force_turbo=1
over_voltage=6
kernel=/boot/zImage
initramfs /boot/initrd.romfs.gz 0x02000000
#
以下略

とすると1.2GHz固定、1.35Vになります。
over_voltage=6はなくても同じ結果になりますが、この次のことも考えて書いておきます。

続いて600MHz指定

arm_freq=600
arm_freq_min=600
over_voltage=0
kernel=/boot/zImage
initramfs /boot/initrd.romfs.gz 0x02000000
#
以下略

とすると600MHz固定になります。
arm_freq=600だけでいいはずなのですが、念のため最低周波数、電圧も明示しました。

動作確認してみましょう。
ラズパイのCPU動作周波数を確認するには、

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

または
vcgencmd measure_clock arm

電圧の確認は、

vcgencmd measure_volts

で確認できるはずですが、軽量化のためにいろいろな機能を外しているLightMPDではいずれのコマンドも通りません。(苦笑)
このレベルの周波数を直接確認する測定器もありませんので、今回はtopコマンドでCPU負荷をモニターしてみます。

わかりやすくするため、mpd.confで

audio_output_format “192000:32:2”
samplerate_converter “soxr very high”

と指定して、CDリッピングファイルを再生しながらサンプリングレート変換させて負荷をかけ続けます。

こちらがarm_freq=600指定(600MHz)の時

こちらがforce_turbo=1指定(1200MHz)の時です。

mpdプロセスのCPU使用率を見ると、600MHz指定の方が倍くらいに上がっていますので、どうやら思惑通りに動作しているようです。

動作確認できたので、出力フォーマット(リサンプリング)設定を”*:24:2″に戻して、
・600MHz固定
・標準(600MHz/1.2GHz可変)
・1.2GHz固定
で比較してみます。

環境はこれまで通り、
Raspberry Pi3 modelB
HiFi Berry DAC+ PRO(クロックをNZ2520SDに換装)でPi3をスレーブモード動作
DACはPCM1794A
I/V変換はMUSES8920
LPF&バッファはLME49724でバランス増幅&出力
電源は6Vバッテリーx1と12Vバッテリーx2を使い、定電圧回路はシリーズレギュレータで構成したもの。
アンプ、スピーカーも、いつもの定インピーダンスアッテネータ経由の自作バッテリードライブMOSFETフルバランスアンプにAlpair7v3の自作スピーカーです。

標準:LightMPD本来の音です。突き抜ける爽やかさ、定位感と広がり感が素晴らしい。(注1)
600MHz固定:標準に比べるとベースパートの押し出し感が増した感じです。標準と比べると僅かにキツく感じる音があります。(注1)
1.2GHz固定:標準に安定感が加わったような感じで、音楽としての流れや滑らかさ、熱気が増したように感じます。ベースパートは引き締まったように感じます。(注1)
勢いで、4倍オーバーサンプリングや、D-PLLをキャンセルした内部クロックでも試しましたが、クロック指定による音の変化の傾向は同じでした。(注1)
この中では、1.2GHz固定が、より私好みのサウンドです。

続いて電圧を変えた時の比較をしてみたのですが、どの周波数でも電圧を下げると粗さが目立つようになり、電圧を上げるとぐっとリアリティが増したように感じました。電圧による変化はクロック周波数による変化より大きく感じたくらいです。(注1)
あわせて、Volumio、MoodeAudioでも試しましたが、やはりクロックアップ、電圧アップの方が、好印象でした。(注1)

今回の実験で私の環境では、どのMPDパッケージでもクロックアップ、電圧アップの方が好ましく感じる。という結果になりました。(注1)

このほか、特定のCPUコアをOSのスケジューリングから独立させ、CPUアフィニティでプロセス/スレッドをそのコアで動作させたり、プロセス/スレッドの優先度スケジューリングポリシーを変えてMPDと関連プロセス/スレッドを特定のコアで優先度を上げて実行させることなども、何故だか音に影響するようです。
ただし、LightMPDではもともとスケジューリングがFIFOで優先度も高く設定されていますが(私が)CPUアフィニティを設定できなかったり、MoodeAudio3.6ではCPUアフィニティが1番コアに自動的に設定されていたりと、それぞれのパッケージにも特徴がありますので、VolumioとMoodeでできる範囲で設定を変えて比べてみたところ、MPDと関連プロセスを特定のCPUコアで実行させると確かに違いがあるように感じました。(注1)
面白かったのが、4コアあるPi3のcpuコア(0~3)のどれを指定するかでも違いがあることでした。(注1)

ラズパイの場合、カーネルや、IRQ(ハードウエアからの割り込み)は0番コアに強制的に割り当てられているそうで、0番コアと1~3番コアでは元々の忙しさが違うため、特定コアにMPD関連のプロセス/スレッドを割り当てる場合、独立させれば余計な割り込みの入らない1~3番コアを指定する方が多いようです。
実際、MoodeAudioでは1番コアを独立させて、MPDとプレーヤープロセスを1番に割り当てるように指定されています。

実験ではVolumioとMoodeで1番から、2番、3番、0番と切り替えて確認しましたが、1、2、3番はほとんど違いが分からず、0番にしたとき予想に反して定位感、空間感の向上が感じられました。イメージとしてはLightMPDの爽やかさに近づいた感じです。(注1)

0番コアは、忙しいと言いつつ平均的なレイテンシが短いという情報もありましたので、コアの忙しさよりも実際の処理におけるウエイトや遅延が効いているのかもしれません。(注2)

なお、プロセスの優先度設定はMPD関連が通常プロセスより高くなっていれば(21以上ならば)いくつに設定しても変化は感じられませんでした。(注1)
 
 
 
  
 
 
(注1)当社比。個人の感想です。効果の実感には個人差があります。全ての環境での再現を保証するものではありません。

(注2)あくまでも個人の憶測です。