スレッド数が可変の 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 として参照されるスレッドの正確な場所(物理コアとパッケージ)をどのように知ることができますか?