Third Encore

思い出すために忘れたことたち

Raspberry Piのkernelのscheduler

kernelのconfigオプションで選べるschedulerは3種類

  • Cluster
  • Multi-core
  • SMT

Cluster Scheduler

www.phoronix.com

L2 cacheなどのリソースを共有しているコアがある場合に有効、Raspberry Piはこのパターン、音の変化も最も大きく、音質に有効そう。

 

Multi-core scheduler

マルチコア向けということ以外調べてもよく分からず。latencyのplotが大幅に悪化、kernelの通常の動作にも問題ありで適用見送り。

 

SMT scheduler

www.itmedia.co.jp

ひとつのコアで2つのスレッドを実行する技術とのこと。音質に大きな変化があるようには感じられなかったけれど、1コア当たり2スレッド動くのでmake -j8が出来るようになる。

Linuxのkernelのver.がよく分からない話

Allo Boss2を使っていて、Boss2のドライバが入っていてRTパッチが当てられるのが5.16か5.4系列で、新しい方が良いのかと思っていたのですが、新機能がどんどん追加されているのは5.14あたりのkernelらしい。

 

Clang / LLVM用にだけLTOやPGOが追加されているようなので、今後kernelのbuildはClang / LLVMでやるのが良いかもしれない。

CPU governor

Userspaceに設定しておけば所望のCPU周波数が適用されるので大丈夫かと思っていたのだけど、PerfomanceとUserspaceで同じkernelでもlatencyがガクッと違った。

f:id:third-encore:20211230131856p:plain

CPU governor Performance時のlatency



f:id:third-encore:20211230131930p:plain

CPU governor Userspace時のlatency

 

調べて資料を読むと、Userspaceはroot権限で実行するプログラムについてscaling_setspeedで周波数を設定するとのことで、MPDなどユーザー名にroot以外を指定して実行しているプログラムも考えるとPerformanceを指定しておくべきらしい。

https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt

2021年12月27日のメモ

Raspberry Piのkernleのheaderのinstallは

$ apt install raspberrypi-kernel-headers

 

GCCでmakeしたkernelは起動するのにClangでmakeしたkernelが起動しなかった件、

$ sudo cp arch/arm64/boot/Image /boot/kernel8-`make kernelrelease`.img

でkernel imageをcopyしていたのを

$ sudo make install

することで起動するようになった。

KernelのPGO

2022年1月1日追記:

make KCFLAGS=-fprofile-use

を実行すると、gcovを--preserve-pathオプション付きで実行した際の出力ファイル名のファイルが求められるのに/sys/kernel/debug/gcov以下のファイルは元のソースのディレクトリ構造を維持しているので、ファイル名をリネームしないとPGOが適用されない。スクリプトを書けば良いのだろうけれど現状そこまで手が回ってません。

 

Kerelのver.が変わるとやり方も変わりそうだけど、2021年12月25日時点でver. 5.16は下記の方法で出来た。

https://linuxplumbersconf.org/event/7/contributions/771/attachments/630/1193/Exploring_Profile_Guided_Optimization_of_the_Linux_Kernel.pdf

 

下記の方法でlatencyをplot。

www.osadl.org

 

1枚目がCFLAGSに-O3 -mcpuを指定しただけのもの。

f:id:third-encore:20211226205642p:plain

 

2枚目が-O3 -mcpuにPGOをかけたもの。

f:id:third-encore:20211226205644p:plain

若干だけどlatencyの値が小さくなっています。

 

Clang / LLVMでbuildするとPGO + LTOが出来るはずなんだけど、起動しないimgが出来て困っている。

Clang / LLVMでProfile-Guided Optimization (PGO)

ざっくり

CFLAGS/CPPFLAGS="-O3 -mcpu -fcoverage-mapping -fprofile-instr-generate -gline-tables-only"

LDFLAGS="-fprofile-instr-generate" \

LLVM_PROFILE_FILE="code-%p.profraw"

を設定してbuild、実行。

 

$ cd /path/to/src

して

$llvm-profdata merge -output=code.profdata code-*.profraw

でprofrawデータをprofdataファイルにマージ。

 

CFLAGS/CXXFLAGS="-O3 -mcpu -fprofile-use=code.profdata -Wno-coverage-mismatch -Wno-error=coverage-mismatch"

で再度build

 

ってな流れっぽい。メモ。