Я пытаюсь установить сродство ядра (Thread # 1 идет на первом ядре, Thread # 2 идет на второе ядро, ...), используя std :: thread в C++ 11 .Получение нити Сродство ядра в C++ 11 через pthreads
Я уже искал различные темы и в Интернете, и кажется, что C++ 11 API не обеспечивает такую функцию низкого уровня.
С другой стороны, Pthreads приходят с pthread_setaffinity_np, которые было бы полезно, если бы я мог получить «pthread_t» значение моей станд :: нить (я не знаю, если это разумно человек или, по крайней мере, законным запрашиваемая для этого).
Пример программы, что я хочу, чтобы в конце концов, это:
#include <thread>
#include <pthread.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define CORE_NO 8
using namespace std;
void run(int id) {
cout << "Hi! I'm thread " << id << endl;
// thread function goes here
}
int main() {
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
for(int i=0; i<CORE_NO; i++)
CPU_SET(i, &cpu_set);
thread t1(run, 1);
// obtaining pthread_t from t1
/*
pthread_t this_tid = foo(t1);
pthread_setaffinity_np(this_tid, sizeof(cpu_set_t), &cpu_set);
*/
t1.join();
return 0;
}
Я действительно предпочитаю не менять всю архитектуру моего проекта (который должен обеспечить такую характеристику). Я теперь широко использую std :: thread, но я также могу использовать API pthread, как вы видели в этом примере.
Есть ли способ решить эту проблему?
', который должен обеспечивать такую характеристику' - какое улучшение производительности вы видели после установления сродства нити? У вас есть номера? –
@ Мартин Джеймс - прикомандированный. Rob013 - По моему опыту, у вас должен быть особый набор обстоятельств, прежде чем возиться с основной аффинностью, что будет автоматически делать ОС. И тогда вам придется иметь нагрузку кода для разработки во время выполнения оптимального сродства к потокам на любом оборудовании, на котором запущена программа, и это сложная проблема. Вероятно, вам лучше позволить ОС сделать все возможное для начала. Если вам действительно нужна близость к основанию, вам, вероятно, также понадобится привязанность к памяти, чтобы получить какую-либо выгоду, и это в любом случае полностью испортит вашу архитектуру. – bazza
Спасибо за ваш совет. Я вижу вашу точку зрения, я уверен, что управление потоками ОС было бы лучше, чем студент, который узнал, с какой близостью привязанность всего пару дней назад. Кстати, мой вопрос касался конкретной проблемы внутри проекта портирования, поэтому мне сказали: «Мы используем сродство ядра, вы его реализуете». И для моих целей решение Йоахима вполне достаточно. – Rob013