Raspberry Piのkernelのscheduler
kernelのconfigオプションで選べるschedulerは3種類
- Cluster
- Multi-core
- SMT
Cluster Scheduler
L2 cacheなどのリソースを共有しているコアがある場合に有効、Raspberry Piはこのパターン、音の変化も最も大きく、音質に有効そう。
Multi-core scheduler
マルチコア向けということ以外調べてもよく分からず。latencyのplotが大幅に悪化、kernelの通常の動作にも問題ありで適用見送り。
SMT scheduler
ひとつのコアで2つのスレッドを実行する技術とのこと。音質に大きな変化があるようには感じられなかったけれど、1コア当たり2スレッド動くのでmake -j8が出来るようになる。
CPU governor
Userspaceに設定しておけば所望のCPU周波数が適用されるので大丈夫かと思っていたのだけど、PerfomanceとUserspaceで同じkernelでも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は下記の方法で出来た。
下記の方法でlatencyをplot。
1枚目がCFLAGSに-O3 -mcpuを指定しただけのもの。
2枚目が-O3 -mcpuにPGOをかけたもの。
若干だけど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
ってな流れっぽい。メモ。