2016-08-12 8 views
0

PAPI를 사용하여 프로그램의 모든 C++ 11 std::thread 스레드의 전체 카운터를 가져오고 싶습니다. int PAPI_thread_init(unsigned long(*handle)(void));PAPI를 C++ 11과 함께 사용하는 방법 std : thread?

핸들이

경우 : PAPI 라이브러리의 스레드 지원이 C에서 다음과 같은 낮은 수준의 함수를 호출하여 초기화 할 수 있습니다

:

PAPI documentation on Threads는 말한다

현재 스레드 ID를 부호없는 long으로 리턴하는 루틴의 포인터.

예를 들어, pthread의 경우 핸들은 pthread_self입니다. 그러나 C과 함께해야 할 일은 잘 모릅니다. PAPI와 다른 무언가를 사용하는 것이 더 합리적이라면.

+0

예 : [이'std :: thread' 참고] (http://en.cppreference.com/w/cpp/thread/thread). 나는 당신을 도울 수있는 멤버 함수를 찾을 수있을 것이라고 확신한다. –

답변

0

C++ 11 스레딩 지원은 std::this_thread::get_id() 함수를 사용하여 std::thread::id 인스턴스를 스트림에 serialize 할 수 있습니다. 그럼 당신은 스트림에서 unsigned long을 읽고 ir를 반환하려고합니다. 이런 식으로 뭔가 :

그래서이 조각에 current_thread_id 기능은 당신이 찾고있는,하지만 당신은 처리 적절한 오류를 추가해야 무엇
#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; 
} 

(스레드 ID는 항상 숫자를하지 않을 수 있습니다,이 경우 당신은되지 않습니다 스트림에서 숫자를 읽을 수 있고 이에 따라 처리해야합니다.)

당신은 이미 리눅스 특정 pthread_self을 소개하고 있기 때문에 어쩌면 단지 GetCurrentThreadId을 사용한다고 말할 수 있습니다.

+0

나는 당신이 여기서 제안한 것을 시도했지만 그것이 효과가 없다고 생각한다. 카운터가 변경되지 않았으며 같은 카운터에서'perf '로 얻는 값과는 거리가 멀습니다. – Nicola

+0

@nicolacdnll 우리는 어떤 카운터를 말하는거야? :) 질문에 대해서는 아무 것도 언급하지 않았습니다. 함수가 호출되고 반환 값이 무엇인지 확인 했습니까? –

+0

지금은 레벨 3 총 캐시 액세스 및 레벨 1, 2 및 3 총 캐시 히트에 관심이 있지만 나중에 다른 것들을 조사하고 싶을 수도 있습니다. 'current_thread_id' 함수가 호출되고 140318347351808, 140318338959104 등과 같은 값을 반환합니다. – Nicola