3

私は試しsysconf(_SC_NPROCESSORS_ONLN)ましたが、両方とも( IntelがCPUドキュメントで呼んでいるようにsysconf(_SC_NPROCESSORS_CONF))スレッドの総数を返します(ハイパースレッディングスレッドのように)、物理コア(前述のIntelサイトではCoreと呼ばれます)ではありません。

論理ではなく、物理コアの数を取得する方法はありますか?のエントリを数えると、/proc/cpuinfoを呼び出すsysconfのと同じように8が得られ、私のプロセッサは上記でリンクされているものです。

LinuxとBSDで、できればCAPIの形式で動作する回答に興味があります。

4

3 に答える 3

6

別の解決策は、hwlocを使用することです。簡単な例を次に示します。

#include <hwloc.h>
#include <stdio.h>

int main(){

  // Allocate, initialize, and perform topology detection
  hwloc_topology_t topology;
  hwloc_topology_init(&topology);
  hwloc_topology_load(topology);

  // Try to get the number of CPU cores from topology
  int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_CORE);
  if(depth == HWLOC_TYPE_DEPTH_UNKNOWN)
    printf("*** The number of cores is unknown\n");
  else
    printf("*** %u core(s)\n", hwloc_get_nbobjs_by_depth(topology, depth));

  // Destroy topology object and return
  hwloc_topology_destroy(topology);
  return 0;
}

これは、Red Hat4.1.2-48をGCC4.1.2で実行しているLinuxボックスと、OSX10.8.1をGCC4.2.1で実行しているAppleでテストしました。

于 2012-09-18T22:39:39.030 に答える
4

これはCAPIではなく、おそらくLinuxでのみ機能します。しかし、これが私が知っているすべてです、多分あなたはこれが役に立つと思うでしょう。

/proc/cpuinfoのCPU記述には、いくつかのフィールドがあります。physical idは物理CPU識別子でありcore id、は物理コア識別子です。一意の(physical id, core id)ペアの数を計算すると、必要なものが得られます。

cpu coresリストされている各物理CPUのフィールドを確認することもできます。

于 2012-09-18T19:19:50.940 に答える
2

のファイルは/sys/devices/system/cpu/cpu<n>、この種の情報の解析がはるかに簡単で、トポロジに関する追加情報が含まれています。それはまだ事前にラップされたAPIではありませんが、探しているのがCPU数と、おそらくどのスレッドがどのコアに属し、どのチップに属しているかだけであれば、これを解析するために何かを書くことはそれほど悪くありません。すでにこれを解析しているライブラリ(たとえば、cgroupsもの)があることを知っているので、それを実行するための良い方法を見つけるための参照ポイントがあり、必要に応じてそれらのライブラリの一部を使用する方法さえあるかもしれません。

于 2012-09-18T20:52:46.060 に答える