2016-08-12 98 views
0

我想使用PAPI來獲取程序中所有C++ 11 std::thread線程的總計數器。如何使用PAPI與C++ 11 std:thread?

PAPI documentation on Threads說:int PAPI_thread_init(unsigned long(*handle)(void));

其中手柄是

在PAPI庫線程支持可以通過調用在C以下的低層函數初始化

指向將當前線程ID作爲無符號長整型返回的例程的指針。

例如,對於pthreads,句柄爲pthread_self。 但是,我不知道它應該與C++ 11 std::thread。 如果使用與PAPI不​​同的東西更有意義。

+0

檢查例如[這個'std :: thread'引用](http://en.cppreference.com/w/cpp/thread/thread)。我相信你可以找到一些可以幫助你的成員函數。 –

回答

0

C++ 11線程支持具有std::this_thread::get_id()函數,該函數返回一個可以序列化爲流的std::thread::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可能並不總是一個數字,在這種情況下,你會不會能夠從流中讀取一個數字,你應該相應地處理)。

也就是說,也許只是使用GetCurrentThreadId,因爲您已經介紹了Linux特定的pthread_self

+0

我嘗試了你在這裏的建議,但我想它不起作用。 這些計數器沒有改變,我在一些相同的計數器上用'perf'得到的值遠離我的值。 – Nicola

+0

@nicolacdnll我們在談什麼櫃檯? :)這個問題沒有提到任何關於這個問題。你檢查函數是否被調用,返回值是什麼? –

+0

現在我對3級總緩存訪問和1,2級和3級總緩存命中感興趣,但後來我可能想要查看其他內容。 'current_thread_id'函數被調用,它返回值如140318347351808,140318338959104等等。 – Nicola