Wie, um sicherzustellen, dass std::thread erstellt werden in multi-core?
Ich bin mit visual studio 2012. Ich habe ein Modul, wo ich gelesen haben, eine riesige Menge von Dateien von der Festplatte nach der Durchquerung Ihre entsprechenden Pfade über eine xml. Für diese mache ich
std::vector<std::thread> m_ThreadList;
In einer while-Schleife drück ich mich wieder in einem neuen thread in diesem Vektor, so etwas wie
m_ThreadList.push_back(std::thread(&MyClass::Readfile, &MyClassObject, filepath,std::ref(polygon)));
Mein C++11 multi-threading wissen ist begrenzt.Die Frage, die ich hier habe , ist , wie Sie tun, erstellen Sie einen thread auf, eine bestimmte Kern ? Ich weiß von parallel_for und parallel_for_each in vs2012, dass eine optimale Nutzung der Kerne. Aber, gibt es eine Möglichkeit, dies zu tun mit standard C++11?
- Die C++ - thread-Funktionen haben keine Kenntnis von "cores", und daher können Sie nicht binden eines Threads an einen bestimmten Kern.
- Ich weiß wirklich nicht, aber ich vermute,
SetThreadAffinityMask
und das handle zurückgegeben vonstd::thread::native_handle()
vielleicht werden die nächsten, die Sie bekommen können. (Aber ich Stimme zu, dass es keine Möglichkeit gibt, dies zu tun, rein in den C++11 Standard, d.h. ohne Plattform-spezifische Aufrufe.) - Und als allgemeiner Tipp, wenn du mehrere threads zum Lesen aus mehreren Dateien, die auf dem gleichen Dateisystem, werden Sie wahrscheinlich machen das Programm langsamer durch das Betriebssystem haben zu suchen hin und her und jedes mal gibt es einen thread-context-switch. (Zumindest auf den alten mechanischen Festplatten, moderne SSDs umgehen sollten dies besser.)
- Meinst du das wirklich eine "spezifische " core"? Wie "ich möchte, dass dieser thread speziell auf core #2"?
- Drew Dormann :: ich haben vier Kerne, im Idealfall möchte ich die threads erstellt werden, die core, die weniger benutzt
- wenn Sie möchten, um Sie zu verwalten, suchen, um für "thread-Affinität"
- Joachim Pileborg :: Was ist der effizienteste Weg, den Sie vorschlagen, in diesem Fall ?
- std::thread::hardware_concurrency die Ihnen helfen könnte.
- Wenn es wirklich nur um "ich will nicht, dass meine 4 threads, um am Ende alle auf dem gleichen Kern". Dann ist die einfache Antwort ist "C' Mon, Sie verwenden ein Betriebssystem, das ist vollkommen bewusst, multi-core-Prozessoren und ist das nicht dumm". Aber wenn die Frage ist "will ich thread 2 ausgeführt werden, auf Kern 3" (gleich aus welchem Grund sollte dies notwendig sein auf einer multi-core in einem "normalen" Anwendung), dann sind Sie bis auf die Gnade des Plattform-abhängigen Funktionen.
- Durch die Art und Weise, so dass, wenn Sie haben 100 Dateien, die Sie sind gonna start 100 threads? Viel Glück.
- 'core, die weniger benutzt' werden, da diese ändern können, in einer unvorhersehbaren Art und Weise zu fast jeder Zeit, werden Sie ein problem haben. Lass es einfach auf das OS, wie andere vorgeschlagen haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in anderen Kommentaren, kann man nicht einen thread eröffnen "auf einem bestimmten Kern", als C++ hat keine Kenntnis von architektonischen details. Außerdem, in den meisten Fällen das Betriebssystem wird in der Lage sein zu verwalten und die Verteilung von threads zwischen Kernen/Prozessoren gut genug.
Sagte, es gibt Fälle, in denen das erzwingen einer bestimmten Verteilung der threads zwischen Kernen von Vorteil sein kann für die Leistung. Als ein Beispiel, von zwingen, einen thread zur Ausführung auf einem bestimmten Kern, ist es möglich, minimieren, verschieben von Daten zwischen verschiedenen Prozessor-caches (die können entscheidend sein für die Leistung in bestimmte Speicher-gebundene Szenarien).
Wenn Sie möchten, gehen Sie auf dieser Straße, Sie werden sehen, in Plattform-spezifischen Routinen. E. g., für GNU/linux mit POSIX-threads werden Sie wollen
pthread_setaffinity_np()
im FreeBSDcpuset_setaffinity()
im WindowsSetThreadAffinityMask()
usw.Habe ich einige relevante code-snippets hier, wenn Sie interessiert sind:
http://gitorious.org/piranhapp0x/mainline/blobs/master/src/thread_management.cpp
Ich bin ziemlich sicher, dass die core-Affinität ist nicht enthalten in der std::thread. Die Annahme ist, dass das OS perfekt in der Lage, optimale Nutzung der verfügbaren Kerne. In allen außer den extremsten Fällen sind Sie nicht zu schlagen die OS Entscheidung, so die Annahme ist fair.
Wenn Sie gehen, dass die route dann müssen Sie einige Entscheidungen zu Ihrem code berücksichtigen Maschine-Architektur, um sicherzustellen, dass Ihre Entscheidung besser ist als die Betriebssysteme auf jeder Maschine laufen Sie auf. Das erfordert viel Mühe! Für den Anfang werden Sie wollen, um die Anzahl der threads mit der Anzahl der Kerne auf dem computer. Und Sie haben noch keine Kenntnis von dem, was sonst noch Los ist in der Maschine; das OS nicht!
Das ist der Grund, warum thread-pools existieren. Sie neigen dazu, standardmäßig zu haben, so viele threads wie Prozessorkerne zur Verfügung stehen, automatisch von der Laufzeitumgebung. AFAIK C++11 nicht einer von denen. Also das einzig gute, was Sie tun können, um die optimale Leistung ist es, herauszufinden, wie viele Kerne vorhanden sind und die Anzahl der threads, die Sie haben, um diese Zahl. Ansonsten ist es wahrscheinlich am besten, um das Vertrauen der OS.
Joachim Pileborg Kommentar ist es Wert Aufmerksamkeit auf, es sei denn, die Arbeit getan, indem jeder thread überwiegt die I/O-overhead.
Als einen schnellen überblick über das einfädeln im Rahmen des dispatching-threads zu Prozessorkernen:
Den meisten modernen Betriebssystemen machen Verwendung von kernel-level-threads, oder hybrid. Mit kernel-level threading-das Betriebssystem "sieht" alle threads in jedem Prozess; im Gegensatz zu user-level-threads, die beschäftigt sind in Java, wo das OS sieht ein einziges Verfahren, und ist keine Kenntnis von threading. Nun, da Sie mit kernel-level threading, der OS erkennen zu können, das separate threads eines Prozesses, verwaltet und Ihr Versand auf einen bestimmten Kern, es ist das Potenzial für echte Parallelität - in dem mehrere threads des gleichen Prozesses ausgeführt werden auf verschiedenen Kernen. Sie, als Programmierer, haben keine Kontrolle über diese jedoch, wenn die Beschäftigung
std::thread
; das OS entscheidet. Mit user-level-threading, alle die Verwaltung der threads auf der Benutzer-Ebene, mit Java, eine Bibliothek verwaltet die "Versand". Im Fall von hybrid-threading -, kernel-threading verwendet wird, wo jeder kernel thread ist eigentlich eine Reihe von user-level-threads.