私のアプリケーションは最大のシングルスレッドパフォーマンスを必要とし、Intel Eコアに切り替えるのに苦労しています。
私はBIOSにアクセスせずにUbuntu 20.04システムのIntel i9-12900KでEコアを無効にする方法を探しています(レンタル専用サーバーです)。あるいは、これらのコアを区別し、CPU類似性を割り当てることによってtaskset
実行から除外することができる可能な方法があります。
私はGoogleで自分の答えを見つけようとしました。現在、間違いなくスケジューラの問題があることがわかりましたが、私の問題に対する明確な修正や回避策はありません。
答え1
taskset
あなたの場合に完全に機能するアプリケーションにコアを割り当てるための標準機能です。たとえば、Intel Core i9 12900K の場合、最初の 16 コアにタスクを固定するだけです。
taskset 0xFFFF application
taskset -c 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 application
2番目の形式は長いですが、読みやすいです。
私が知っている限り、標準のLinuxカーネルには現在、特定のアプリケーションが特定の種類のカーネルを使用する必要があることをカーネルに知らせるインフラストラクチャはありません。はい、LinuxカーネルはBIG.little ARMアーキテクチャをサポートしていますが、この機能を使用するAPIについて聞いたことはありません。
2022年1月現在、Linuxカーネルはいいえあらゆる形態のIntelスレッドコントローラをサポートします。パッチもなく、何もありません。
最後に、LinuxとWindowsがHT / SMT兄弟を報告する方法が異なることに注意する必要があります。
Windowsでは、これをペアでリストします(たとえば、コア1:スレッド1スレッド2、コア2:スレッド1スレッド2など)。 Linux はまずすべての物理コアをリストし、次に HT/SMT 兄弟コアをリストします。
したがって、物理コアをテストしたい場合いいえ16コアCPUにHT / SMTを使用すると、次のことができます。
taskset -c 0,1,2,3,4,5,6,7 application
taskset 0xFF application
詳細については、ここをクリックしてください。どのプロセッサが物理コアであるかをどうやって知ることができますか?
オプションN2:Eコアをオフラインにするとシステムに見えなくなります。
echo 0 | sudo tee /sys/devices/system/cpu/cpu{NN}/online
Intel Core i9 12900Kの場合
for i in {16..23}; do echo 0 | sudo tee /sys/devices/system/cpu/cpu${i}/online; done
答え2
e-core を完全に無効にする代わりに、以下を使用します。isolcpus
汎用スケジューラーからe-coreを分離するために使用される開始パラメーター。
たとえば、Intel Core i9 12900Kの場合:
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=16,17,18,19,20,21,22,23"
$ sudo update-grub
taskset
その後、以下を使用するか、手動でeコアを特定のプロセスに割り当てることによって引き続き使用できますcset
。
$ sudo taskset -p 0xFF0000 <pid>
または、次のものを使用できます。cset shield
。
答え3
chcpu -d [cpulist]
いつでもコアをオフラインに切り替えることができます。
バラよりman chcpu