2016-08-12 8 views
0

Я хотел бы использовать PAPI для получения общих счетчиков всех потоков C++ 11 std::thread в программе.Как использовать PAPI с C++ 11 std: thread?

PAPI documentation on Threads говорит, что:

Поддержка потоков в библиотеке PAPI можно инициализировать с помощью вызова следующей функции низкоуровневого в C: int PAPI_thread_init(unsigned long(*handle)(void));

где ручка является

Указатель на процедуру, которая возвращает текущий идентификатор потока как unsigned long.

Например, для 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 является то, что вы ищете, но вы должны добавить надлежащую обработку ошибок (идентификатор потока не всегда может быть несколько, в этом случае вы не будете способный читать номер из потока, и вы должны соответствующим образом обрабатывать его).

Это, как говорится, возможно, просто используйте GetCurrentThreadId, так как вы уже представляете Linux pthread_self.

+0

Я попробовал то, что вы предлагаете здесь, но я думаю, что это не сработает. Счетчики не менялись, и я далеко от значений, которые я получаю с 'perf' на некоторых же счетчиках. – Nicola

+0

@nicolacdnll какие счетчики мы говорим? :) В вопросе об этом ничего не упоминалось. Вы проверяли, вызвана ли функция и каково возвращаемое значение? –

+0

Прямо сейчас меня интересуют общий доступ к кеш-памяти уровня 3 и общий уровень кэширования уровня 1, 2 и 3, но позже я, возможно, захочу изучить другие вещи. Вызывается функция 'current_thread_id' и возвращает значения, такие как 140318347351808, 140318338959104 и т. Д. – Nicola

 Смежные вопросы

  • Нет связанных вопросов^_^