1

スレッド数が可変の C++ マルチコア プログラムを開発していますが、適切な (実際には「最高の」) アフィニティを設定する方法を知りたいです。私は Boost-threads を使用しているので、get_hardware_concurrency() を呼び出して論理コアの数を知ることができます。今まで、「n_th スレッドから n 番目の論理コア」へのマッピングを書きましたが、マルチソケット プロセッサと HyperThreading のせいで、これはあまり賢明なことではありません。私のプログラムは常に SIMD に似ているため、スレッド間で共有するものは何もありません。HT コンピューターの場合、想像できる最もスマートな方法でスレッドを論理コアにバインドしたいと考えています。最初の物理上の最初の論理コア、 2 番目の物理上の 1 番目の論理、...、n 番目の物理上の 1 番目の論理、1 番目の物理上の 2 番目の論理など。

HT が有効かどうか (CPUID) を検出する方法と、パッケージごとに論理コアと物理コアを決定する方法について議論されている多くの資料を見つけました。いくつかのアセンブリ コードを処理する必要があることはわかっており、怖くはありませんが、論理コア、物理コア、およびパッケージに関する完全な情報と、OS がそれらすべてを処理する方法を知る方法を本当に見つけることができませんでした。

私ができる最も簡潔であること:OS(WindowsおよびLinux)によって N-th として参照されるスレッドの正確な場所(物理コアとパッケージ)をどのように知ることができますか?

4

4 に答える 4

5

Linux での CPU トポロジを示すコード スニペットを次に示します。

#!/bin/bash
function filter {
  cat /proc/cpuinfo | grep -E "$1.*: [0-9]*" | sed -e 's/^.*: //g'
}

CPU_ID=`filter processor`
SOCKET_ID=(`filter 'physical id'`)
CORE_ID=(`filter 'core id'`)

for cpu_id in $CPU_ID; do
    echo "cpu $cpu_id: socket${SOCKET_ID[$cpu_id]}_core${CORE_ID[$cpu_id]}"
done

HT が有効なコア i7 でこれを実行すると、次の出力が得られます。

cpu 0: socket0_core0
cpu 1: socket0_core1
cpu 2: socket0_core2
cpu 3: socket0_core3
cpu 4: socket0_core0
cpu 5: socket0_core1
cpu 6: socket0_core2
cpu 7: socket0_core3

ここでは、CPU 0 と 4 が同じコア上にあることがわかります。つまり、コア 0 の HT スレッドです。

これを sched_setaffinity またはpthread_setaffinity_np(3)と組み合わせて使用​​すると、プロセスを一連の CPU にマップできます。コード行なしでtaskset(1)を使用することもできます。

于 2011-10-18T20:37:31.050 に答える
3

Windows の場合: GetLogicalProcessorInformationおよびSetThreadAffinityMask

もありますGetCurrentProcessorNumber()が、特定の CPU にピン留めしていない場合、OS はスレッドを頻繁にスワップするため、それ自体では目的には役立ちません。

于 2011-10-18T18:25:37.327 に答える
1

Linux では、sched_setaffinity の man ページを調べてください。

于 2011-10-18T18:45:42.743 に答える
1

マルチコア環境におけるトポロジーとアフィニティの問題は、LIKWID ツール スイートによって便利に処理されます。これには、特に、トポロジーの把握、スレッドのコアへの固定、およびハードウェア パフォーマンス メトリックの測定のためのツールが含まれています。

http://code.google.com/p/likwid

コード内のスレッド化メカニズムが pthreads に基づいており、アプリケーションが動的にリンクされている限り、likwid-pin はソース コードを変更せずにスレッドをリソースにバインドできます。

于 2012-05-21T06:39:12.623 に答える