2013-04-16 11 views
7

C++でstd :: threadを使用している間にコアアフィニティを設定しようとしています(スレッド#1は第1コア、スレッド#2は第2コア)スレッドを取得するC++ 11でのpthreadsのコアアフィニティー

私はすでにさまざまなトピックやインターネットで検索しており、C++ 11 APIではそのような低レベルの機能は提供されていないようです。一方

、pthreadsのは、私は私のstd「がpthread_t」の値を取得することができれば有用であろうpthread_setaffinity_np ::スレッドが付属して、これは人間の合理的または少なくとも正当な要求している場合には(私は知りませんそれのための)。

私は最後にしたいと思います何のプログラム例はこれです:

#include <thread> 
#include <pthread.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

#define CORE_NO 8 

using namespace std; 

void run(int id) { 
    cout << "Hi! I'm thread " << id << endl; 
    // thread function goes here 
} 

int main() { 
    cpu_set_t cpu_set; 

    CPU_ZERO(&cpu_set); 
    for(int i=0; i<CORE_NO; i++) 
     CPU_SET(i, &cpu_set); 

    thread t1(run, 1); 

    // obtaining pthread_t from t1 

    /* 
    pthread_t this_tid = foo(t1); 
    pthread_setaffinity_np(this_tid, sizeof(cpu_set_t), &cpu_set); 
    */ 

    t1.join(); 

    return 0; 
} 

私は本当に(このような特性を提供しなければならない)私のプロジェクトの全体のアーキテクチャを変更しないことを好むだろう。私はstd :: threadを大量に使用しましたが、この例で見たように、pthread APIも使用できます。

この問題を解決する方法はありますか?

+0

'このような特性を提供する必要があります - スレッドアフィニティを設定した後にどのようなパフォーマンスの向上が見られましたか?数字はありますか? –

+0

@マーティン・ジェームズ - seconded。 Rob013 - 私の経験では、OSが自動的に何をするのかがコアアフィニティで打ち砕かれる前に、非常に特殊な環境が必要です。そして、実行時に、プログラムが実行されているハードウェア上のスレッドに対する最適な親和性を確保するためのコードのロードが必要です。これは面倒な作業です。あなたはおそらく、OSが最善を尽くすことをお勧めします。コアアフィニティが本当に必要な場合は、メモリアフィニティが必要になりますが、これはメリットがあります。 – bazza

+2

あなたのアドバイスをありがとう。私はあなたの視点を見て、私はOSのスレッド管理は、コアの親和性がちょうど数日前であることを学んだ学生よりも優れていると確信しています。ちなみに、私の質問は、移植プロジェクト内の特定の問題に関するものでしたので、私は "*私たちはコアアフィニティを使用します。私の目標ではヨアヒムの解決策で十分です。 – Rob013

答えて

10

native_handle関数を使用してスレッドのネイティブハンドルを取得できます。

リンク参照の例では、これを使用してpthread関数を呼び出すことさえできます。

+1

はい、でも、それはpthread_t型であるとは限りません。 PThreads自体は、しばしば基盤となるOSのネイティブスレッドの上にあるレイヤーです。おそらくNPTLを持つLinuxは例外です。したがって、コアの親和性を処理するためには、OS固有のルーチンが必要です。 – bazza

7

あなたのケースでは適切なアプローチであるかどうかはわかりませんが、通常はスレッド内から親和性プリミティブを呼び出すことです。例えば、私は、スレッド、関数の先頭で、この1頭のどこかに類似したコードのスニペットを配置します。

const int err = pthread_setaffinity_np(pthread_self(),...); 

pthread_self()への呼び出しは、呼び出しスレッドのIDを返します。

関連する問題