2016-08-12 10 views
0

PAPIを使用して、プログラム内のすべてのC++ 11 std::threadスレッドの全体カウンタを取得したいと考えています。 PAPIライブラリでのスレッドのサポートはCで、以下の低レベルの関数を呼び出すことで初期化することができC++でPAPIを使用する方法11 std:thread?

int PAPI_thread_init(unsigned long(*handle)(void));ハンドルが

ある

PAPI documentation on Threadsはと言います

現在のスレッドIDを符号なしlongとして返すルーチンへのポインタ。

たとえば、pthreadの場合、ハンドルはpthread_selfです。 しかし、私はそれがC + + 11 std::threadと一緒にすべきかどうか分かりません。 PAPIとは異なるものを使用する方が理にかなっているとは限りません。

+0

[この 'std :: thread'リファレンス](http://en.cppreference.com/w/cpp/thread/thread)。私はあなたを助けることができるいくつかのメンバー機能を見つけることができると確信しています。 –

答えて

0

C++ 11スレッディングサポートには、ストリームにシリアル化できるstd::thread::idインスタンスを返す関数std::this_thread::get_id()があります。その後、ストリームからunsigned longを読み込み、irを返します。このような何か:

#include <thread> 
#include <iostream> 
#include <sstream> 

unsigned long current_thread_id() 
{ 
    std::stringstream id_stream; 
    id_stream << std::this_thread::get_id(); 
    unsigned long id; 
    id_stream >> id; 
    return id; 
} 

int main(int argc, char** argv) 
{ 
    std::cout << current_thread_id(); 
    return 0; 
} 

だから、このスニペットでcurrent_thread_id機能は、あなたが探しているものですが、(スレッドIDは、常にそのような場合には、あなたがされません、数ではないかもしれない、適切なエラー処理を追加する必要がありますストリームから数値を読み取ることができ、それに応じて処理する必要があります)。

あなたはすでに特定のLinuxを導入しているので、GetCurrentThreadIdと言っています。pthread_selfです。

+0

私はあなたがここで提案したものを試しましたが、うまくいかないと思います。 カウンタは変更されませんでした。同じカウンターで 'perf 'を使って得た値からかなり離れています。 – Nicola

+0

@nicolacdnllどのようなカウンターについて話していますか? :)質問はそれについて何も言及しなかった。関数が呼び出されているかどうか、戻り値は何ですか? –

+0

今はレベル3のキャッシュアクセスとレベル1,2、および3の合計キャッシュヒットに興味がありますが、後で他のものを調べたいかもしれません。 'current_thread_id'関数が呼び出され、140318347351808,140318338959104などの値が返されます。 – Nicola

関連する問題