2013-04-16 5 views
7

Ich versuche, Core-Affinität festlegen (Thread # 1 geht auf den ersten Kern, Thread # 2 geht auf den zweiten Kern, ...) während std :: thread in C++ 11 .Erhalten von Thread Core-Affinität in C++ 11 durch Pthreads

Ich habe bereits um verschiedene Themen und im Internet gesucht und es scheint, C++ 11 API bietet keine solche Low-Level-Funktion.

Auf der anderen Seite, pThreads kommen mit pthread_setaffinity_np, das nützlich sein würde, wenn ich den „pthread_t“ Wert meiner std :: thread bekommen kann (ich weiß nicht, ob dieser Mensch sinnvoll oder zumindest legitim zu fragen ist dafür). diese

Ein Beispielprogramm von dem, was ich am Ende haben wollen würde, ist:

#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; 
} 

ich wirklich würde es vorziehen, nicht die ganze Architektur meines Projektes zu ändern (die so charakteristisch liefern muß). Ich habe jetzt eine massive Verwendung von std :: thread, aber ich kann pthread API auch zusätzlich verwenden, wie Sie in dem Beispiel gesehen haben.

Gibt es eine Möglichkeit für mich, dieses Problem zu lösen?

+0

"welche solche Eigenschaften bieten muss" - welche Leistungsverbesserung haben Sie nach der Einstellung der Thread-Affinität gesehen? Hast du irgendwelche Nummern? –

+0

@Martin James - abgeordnet. Rob013 - Meiner Erfahrung nach müssen Sie sehr spezielle Umstände haben, bevor Sie sich mit Core Affinity Beats beschäftigen, was das Betriebssystem sowieso automatisch tut. Und Sie müssen dann eine Menge Code haben, um zur Laufzeit die optimale Affinität für Threads auf der Hardware zu entwickeln, auf der das Programm ausgeführt wird, und das ist eine Menge Ärger. Es ist wahrscheinlich besser, wenn Sie das Betriebssystem von Anfang an tun lassen. Wenn Sie wirklich Core-Affinität benötigen, benötigen Sie wahrscheinlich auch eine Speicheraffinität, um einen Vorteil zu erzielen, und das wird Ihre Architektur sowieso völlig durcheinander bringen. – bazza

+2

Danke für Ihren Rat. Ich sehe Ihre Sichtweise, ich bin mir ziemlich sicher, OS-Thread-Management wäre besser als ein Student, der gelernt hat, was Kernaffinität nur vor ein paar Tagen ist. Übrigens war meine Frage über ein spezifisches Problem in einem Portierungsprojekt, so dass mir nur gesagt wurde: * * wir * verwenden Kernaffinität. Sie implementieren es. Und für meine Ziele ist Joachims Lösung völlig ausreichend. – Rob013

Antwort

10

Sie können das native Handle für den Thread mit der native_handle-Funktion abrufen.

Das Beispiel in der verknüpften Referenz verwendet dies sogar zum Aufrufen von Pthread-Funktionen.

+1

Ja, aber soweit ich das beurteilen kann, ist das nicht garantiert vom Typ pthread_t. PThreads selbst sind oft eine Schicht über den nativen Threads des zugrunde liegenden Betriebssystems. Linux mit NPTL ist wahrscheinlich die Ausnahme. Sie benötigen also betriebssystemspezifische Routinen, um die Kernaffinität zu handhaben. – bazza

7

Ich weiß nicht, ob es in Ihrem Fall ein geeigneter Ansatz ist, aber was ich normalerweise tue ist, die Affinity-Primitiven innerhalb des Threads aufzurufen. Zum Beispiel, lege ich einen Code-Snippet ähnlich wie diesen irgendwo am Anfang der Gewinde Funktion:

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

Der Aufruf von pthread_self() wird die ID des aufrufenden Thread zurück.

Verwandte Themen