getcpu -
呼び出し元スレッドが動作している
CPU と NUMA
ノードを判定する
#include <linux/getcpu.h>
int getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache);
getcpu()
システムコールは、呼び出し元のスレッドやプロセスが
現在動作しているプロセッサやノードの情報を特定し、
それぞれ引き数
cpu と
node
が指す整数に書き込む。
プロセッサ情報は CPU
を識別するための一意な小さな整数である。
ノード情報は
NUMAノードを識別するための一意な小さな整数である。
cpu か
node
のいずれかが NULL
であれば、
その引き数に対応する情報の書き込みは行われない。
このシステムコールの
3
番目の引き数は現在は使われていない
(「注意」を参照)。
cpu
に格納された情報が最新だと保証できるのは、システムコールが呼ばれ
た時点だけである。
sched_setaffinity(2) を使って CPU affinity
が固定
されていない限り、カーネルはいつでも
CPU を変更してもよい
(スケジューラ
はキャッシュが有効に働くように
CPU
の移動を最小限にしようとするので、
通常は CPU
が変更されることはないが、起きる可能性はある)。
cpu や
node
で返された情報が呼び出しが返った時点ですでに
最新の状況と異なる可能性があり、呼び出し元はこの可能性を考慮して
おかなければならない。
返り値¶
成功すると、0
を返す。
エラーの場合、-1
を返し、
errno
にエラーを示す値を設定する。
エラー¶
- EFAULT
- 引き数が呼び出したプロセスのアドレス空間外を指している。
バージョン¶
getcpu() はカーネル 2.6.19 で x86_64
と i386
向けに追加された.
getcpu() は Linux 固有である。
Linux
はこのシステムコールを可能な限り早く実行しようとする。
getcpu() は、CPU
毎のデータに対する最適化や
NUMA 環境での最適化を
プログラムが行えるようにすることを目的として実装されているからである。
glibc
はこのシステムコールに対するラッパー関数を提供していない。
syscall(2)
を使って呼び出すか、
代わりに
sched_getcpu(3)
を使用すること。
tcache 引き数は Linux 2.6.24
以降では使用されない。以前のバージョン
のカーネルでは、この引き数が
NULL
以外の場合、この引き数には、呼び出し
元が割り当てたスレッド専用の記憶領域
(thread-local storage) 内のバッファ
を指すポインタが指定され、このバッファは
getcpu()
用のキャッシュ機構
を提供するために利用されていた。非常に低い確率だが古い情報を返してしま
うデメリットはあるものの、このキャッシュを使うことで
getcpu() システ
ムコールを高速化できた。このキャッシュ機構はCPU
間でのスレッドの移動時
に問題になると考えられ、この引き数は今では無視されるようになっている。
関連項目¶
mbind(2),
sched_setaffinity(2),
set_mempolicy(2),
sched_getcpu(3),
cpuset(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。