2012-02-21 4 views
3

This questionは、同じCPU上で2つのプロセスが実行されていることを確認します。 sched_setaffinityを使用するプロセスをいくつかの論理CPUに制限できますが、これらを特定の物理CPUおよびスレッドにマッピングするにはどうしたらよいですか?プロセスが特定の物理CPUコアとスレッドで実行されるようにするにはどうすればよいですか?

私はマッピングがあろうと予想される:

0 - CPU 0スレッド0
1 - CPU 0スレッド1
2 - CPU 1スレッド0
3 - CPU 1スレッド1
等..

ここで、左側の数字は、sched_setaffinityで使用される関連CPUです。

しかし、これをテストしようとすると、必ずしもそうではないようです。

void print_cpu() 
{ 
    int cpuid_out; 

    __asm__(
    "cpuid;" 
     : "=b"(cpuid_out) 
     : "a"(1) 
     :); 

    std::cout << "I am running on cpu " << std::hex << (cpuid_out >> 24) << std::dec << std::endl; 
} 

はその後IがCPUマスクのビットにわたってループし、それらを1つのセット:

これをテストするために、私は、EBXに現在コアの初期のAPIC IDを返すCPUID命令を使用しましたOSがプロセスを各論理CPUに順番に移行させてから、現在のCPUをプリントアウトするようにします。これは私が得たものである

は:

cpu mask is 0 
I am running on cpu 0 
cpu mask is 1 
I am running on cpu 4 
cpu mask is 2 
I am running on cpu 2 
cpu mask is 3 
I am running on cpu 6 
cpu mask is 4 
I am running on cpu 1 
cpu mask is 5 
I am running on cpu 5 
cpu mask is 6 
I am running on cpu 3 
cpu mask is 7 
I am running on cpu 7 

は、CPUが、私は上記のスキームに従って初期APIC IDを割り当てていることを想定し、CPUマスクは、実際の物理コアに対応していないと思われると糸。

sched_setaffinityのマスクのビットの物理コアへの正しいマッピングを見つける方法はありますか。

答えて

2

hwlocは、ハードウェア/ NUMAトポロジを検出し、特定のコアにプロセス/スレッドをバインドするための移植性の高いCライブラリです。物理/論理コアを検出し、プロセス/スレッドをバインドする機能を備えています。

looks likesched_setaffinity()と一緒に使用する場合は、そのままcpu_set_tを返してもかまいません。

+0

hwlocの最も優れた機能の1つは、CPUがキャッシュやメモリドメインなどをどのように共有するかなど、システムトポロジの図を表示する機能です。 –