2013-04-16 7 views
7

Я пытаюсь установить сродство ядра (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, как вы видели в этом примере.

Есть ли способ решить эту проблему?

+0

', который должен обеспечивать такую ​​характеристику' - какое улучшение производительности вы видели после установления сродства нити? У вас есть номера? –

+0

@ Мартин Джеймс - прикомандированный. Rob013 - По моему опыту, у вас должен быть особый набор обстоятельств, прежде чем возиться с основной аффинностью, что будет автоматически делать ОС. И тогда вам придется иметь нагрузку кода для разработки во время выполнения оптимального сродства к потокам на любом оборудовании, на котором запущена программа, и это сложная проблема. Вероятно, вам лучше позволить ОС сделать все возможное для начала. Если вам действительно нужна близость к основанию, вам, вероятно, также понадобится привязанность к памяти, чтобы получить какую-либо выгоду, и это в любом случае полностью испортит вашу архитектуру. – bazza

+2

Спасибо за ваш совет. Я вижу вашу точку зрения, я уверен, что управление потоками ОС было бы лучше, чем студент, который узнал, с какой близостью привязанность всего пару дней назад. Кстати, мой вопрос касался конкретной проблемы внутри проекта портирования, поэтому мне сказали: «Мы используем сродство ядра, вы его реализуете». И для моих целей решение Йоахима вполне достаточно. – Rob013

ответ

10

Вы можете получить встроенную ручку для потока с помощью функции native_handle.

В приведенной ссылке ссылка использует это для вызова функций pthread.

+1

Да, но насколько я могу судить, это не гарантировано типа pthread_t. Сами PThreads - это слой поверх основных потоков ОС. Linux с NPTL, вероятно, является исключением. Таким образом, вам понадобятся операционные системы, предназначенные для работы с базой. – bazza

7

Я не знаю, подходит ли это в вашем случае, но то, что я обычно делаю, это вызвать примитивы аффинности из потока. Например, я размещаю фрагмент кода, подобный этому где-то в начале функции резьбовым:

const int err = pthread_setaffinity_np(pthread_self(),...); 

Вызов pthread_self() возвращает идентификатор вызывающего потока.