web-dev-qa-db-ja.com

プログラムでCPUコアを無効にする

Linuxで論理CPUを無効にする方法は、基本的にecho > 0 /sys/devices/system/cpu/cpu<number>/online。この方法では、指定された(<number>) CPU。

私の質問はさらに進んで、無視するだけでなく、プログラムで物理的にオフにすることは可能ですか?エネルギー消費をゼロにするために、CPUが電力を受け取らないようにします。

BIOSからコアを無効にできる(常にではない)ことは知っていますが、特定のプログラム内でコアを無効にできるかどうかを知りたいです。

24
horro

_echo 0 > /sys/devices/system/cpu/cpu<number>/online_を実行すると、次に何が起こるかは特定のCPUによって異なります。 ARM組み込みシステムでは、カーネルは通常、特定のコアPLLを駆動するクロックを無効にするため、効果的に目的のものを取得できます。

Intel X86システムでは、割り込みを無効にしてhlt命令(Linuxカーネルが行う)のみを呼び出すことができます。これにより、ユーザーの要求で別のCPUによってウェイクアップされるまで、CPUは効果的に省電力状態になります。ラップトップを使用している場合、コアを無効にすると_/sys/class/power_supply/BAT{0,1}/current_now_(または電圧などのすべての値の場合はuevent)から電力を読み取るか、「powertop "ユーティリティ。

たとえば、Intel CPUのLinuxカーネルでCPUコアを無効にするための呼び出しチェーンは次のとおりです。 https://github.com/torvalds/linux/blob/master/drivers/cpufreq/intel_pstate.c

_Arch/x86/kernel/smp.c_:_smp_ops.play_dead = native_play_dead,_

_Arch/x86/kernel/smpboot.c_:native_play_dead()-> play_dead_common()-> local_irq_disable()

その前に、CPUFREQはCPUを無効にする前に、CPUを最低の電力消費レベルに設定しますが、これは厳密に必要なようではないようです。

_intel_pstate_stop_cpu_-> _intel_cpufreq_stop_cpu_-> _intel_pstate_set_min_pstate_-> _intel_pstate_set_pstate_-> wrmsrl_on_cpu(cpu->cpu, MSR_IA32_PERF_CTL, pstate_funcs.get_val(cpu, pstate));

Intel X86では、実際のクロックと電圧レギュレータを無効にする公式な方法はないようです。あったとしても、それはマザーボードに固有であり、したがって、最も近い賭けはコアブートなどのBIOSを調べることになるかもしれません。うーん、私はカーネルのソースを調べる以外にインテルについて何も知らないことに気づきました。

14
alexst

現在のところ、利用可能なシステムコールやライブラリ関数はありません。またはioctl実装。新しいモジュール/システムコールの作成とは別に、私が考えることができる2つの方法があります。

  1. aSM asm(<Assembly code>);を使用します。ここで、アセンブリコードはアーキテクチャ固有のasmコードであり、CPUフラグを変更します。

  2. c(man 3 system)。あなたはそれをcを通してやりたいだけだと仮定します。

0
Devidas

cpufreqのようなガバナーを使用すると、これに最も近づくことができます。 LinuxにCPUを除外させると、省電力モードはコアが最低限の周波数で実行されるようにします。

0
Vishal