2017-09-10 3 views
-1

Wie startet man std::thread auf einem anderen Kern, ohne die Prozessoraffinität explizit auf einen bestimmten Kern zu setzen?Wie starte ich einen Thread auf einem anderen Kern, ohne die Prozessoraffinität für einen bestimmten Kern festzulegen?

Ich bin mir bewusst, dass der Thread zu einem bestimmten Kern zugeordnet werden kann aber gibt es eine Möglichkeit, den Scheduler den Prozess auf einem anderen Kern zu starten und den Scheduler entscheiden, welcher Kern am besten ist, den Prozess zu starten?

+2

Der Titel sagt **, wie man einen Thread auf einem anderen Kern ** startet. Der Körper der Frage sagt **, um den Prozess auf einem anderen Kern ** zu beginnen. Entschuldigung, wenn ich missverstanden würde, könnten Sie genauer sein? – Neb

+0

@Neb thread = Prozess – Greg

+1

@Dave Der springende Punkt von Threads ist nicht, einen anderen Prozess zu starten. – user0042

Antwort

0

Die kurze Antwort ist, dass Sie nicht.

Sie haben zwei Möglichkeiten:

  1. Sie wählen den Prozessorkern (e) der Faden auf ausführen, durch seine Affinität zu setzen.
  2. Sie können den Scheduler wählen, auf welchen Kern (en) der Thread ausgeführt wird.

Entweder Sie wählen, oder der Scheduler wählt. So einfach ist das.

Für was Sie scheinen wollen (starten Sie einige Threads, so dass sie auf mehreren Kernen laufen) wollen Sie wahrscheinlich den Scheduler die Planung vornehmen lassen.

Die Einstellung der Prozessoraffinität ist grundsätzlich für Fälle geeignet, in denen Sie genug über die Planung Ihrer Threads wissen, die Sie besser planen können als ein allgemeiner Scheduler. Zumindest von dem, was ich gesehen habe, ungefähr 75% der Zeit, die Leute Affinität setzen, ist es im Grunde ein Fehler, und sie am Ende verlangsamen ihren Code. Weitere 24% schaden ihnen nicht, tun aber auch nicht wirklich gut. Und vielleicht bis zu 1% der Zeit erreichen sie tatsächlich etwas Nützliches.

Seien Sie versichert, dass Leute, die Scheduler schreiben, im Allgemeinen wissen, dass wenn Sie ein Dutzend Threads hochfahren, es nicht mit der Absicht war, dass sie alle auf einem einzelnen Kern laufen. Der einfachste (und wahrscheinlich häufigste) Fall besteht darin, Threads einfach auf allen verfügbaren Kernen zu planen. Wenn dies nicht der Fall ist, liegt es normalerweise daran, dass der Benutzer (zumindest indirekt) das System nicht konfiguriert hat (z. B. ein Teil der Energieverwaltung auf einem Laptop kann sein, dass es im Akkubetrieb die Anzahl der verwendeten Kerne begrenzt.) zumindest unter gewissen Umständen).

Verwandte Themen