おそらく、実行中の現在の CPU の数を取得できるライブラリまたは単純な asm blob が存在します。
4 に答える
sched_getcpu
呼び出し元のスレッドが実行されているCPUを判別するために使用します。man getcpu
(システムコール)およびman sched_getcpu
(ライブラリラッパー)を参照してください。ただし、その内容に注意してください。
cpuに配置された情報は、呼び出し時にのみ最新であることが保証されます。sched_setaffinity(2)を使用してCPUアフィニティが修正されていない限り、カーネルはいつでもCPUを変更する可能性があります。(通常、スケジューラーはキャッシュをホットに保つためにCPU間の移動を最小限に抑えようとするため、これは発生しませんが、可能です。)呼び出し元は、cpuとノードが現在のCPUとノードでなくなった場合の状況に対処できるように準備する必要があります。
次のようなことをする必要があります:
- sched_getaffinity を呼び出して CPU ビットを特定する
- CPU を反復処理し、それぞれに sched_setaffinity を実行します (sched_setaffinity の後、CPU 上にあることが保証されるか、明示的に譲る必要があるかどうかはわかりません)。
- CPUID を実行します (asm 命令)...その出力の 1 つからコアごとの一意の ID を取得する方法があります (インテルのドキュメントを参照)。「APIC ID」だと漠然と覚えています。
- APIC ID から CPU 番号またはアフィニティ マスクなどへのテーブル (std::map ?) を作成します。
- メインスレッドでこれを行った場合は、sched_setaffinity をすべての CPU に戻すことを忘れないでください!
これで、必要なときにいつでも CPUID を再取得して、使用しているコアを検索できます。
しかし、なぜこれを行う必要があるのか 疑問に思います。通常、使用しているコアを見つけるのではなく、sched_setaffinity を介して制御したいと考えます (それが必要/必要になることはほとんどありません)。(そのため、CPUID から正確に何を引き出すかという重要な詳細がわかりません。申し訳ありません!)
更新: ここで litb の応答から sched_getcpu について学びました。ずっといい!(私の Debian/etch libc は古すぎて使えません)。
現在のコアIDを取得する方法はわかりません。カーネルレベルのタスク/プロセスの移行では、何らかの形式のリアルタイムモードで実行していない限り、一定の期間にわたって一定であることが保証されません。
特定のコアを使用したい場合は、そのsched_setaffinity()
関数またはtaskset
コマンドを使用してプログラムを起動できます。ただし、これらを機能させるには、昇格された権限が必要だと思います。次に、プログラムで実行sched_getaffinity()
して、以前に設定されたマスクを確認し、それを実行しているコアでの最良の推測として使用できます。
sysconf(_SC_NPROCESSORS_ONLN);