Как использовать PAPI с С++ 11 std:thread?

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

В документации PAPI по потокам говорится следующее:

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

где ручка

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

Например, для pthreads дескриптор pthread_self. Но я понятия не имею, что должно быть с С++ 11 std::thread. И если имеет смысл использовать что-то отличное от PAPI.


person Nicola    schedule 12.08.2016    source источник
comment
Проверьте, например. эта std::thread ссылка. Я уверен, что вы можете найти некоторые функции-члены, которые могут вам помочь.   -  person Some programmer dude    schedule 12.08.2016
comment
en.cppreference.com/w/cpp/thread/thread/native_handle   -  person Charles L Wilcox    schedule 18.03.2018


Ответы (1)


Поддержка многопоточности 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.

person Rudolfs Bundulis    schedule 12.08.2016
comment
Я попробовал то, что вы предлагаете здесь, но я думаю, что это не работает. Счетчики не изменились, и я далек от значений, которые я получаю с perf на некоторых тех же счетчиках. - person Nicola; 12.08.2016
comment
@nicolacdnll о каких счетчиках идет речь? :) в вопросе об этом ничего не упоминалось. Вы проверили, вызывается ли функция и каково возвращаемое значение? - person Rudolfs Bundulis; 12.08.2016
comment
Прямо сейчас меня интересует общее количество обращений к кешу уровня 3 и общее количество обращений к кешу уровней 1, 2 и 3, но позже я, возможно, захочу изучить другие вещи. Функция current_thread_id вызывается и возвращает такие значения, как 140318347351808, 140318338959104 и так далее. - person Nicola; 16.08.2016