Seite 1 von 2
Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 17:30
von jensknaack
Hallo,
selbst nach längerem Suchen bin ich mir nicht sicher, ob ich das Zusammenspiel von Threads und mehreren Kernen richtig verstehe.
Meine Überlegungen:
1. Mehrere Threads bedeuten nicht zwangsläufig, dass mehrere Prozessorkerne "beschäftigt" werden.
2. Die Fragen hier und im englischen Forum, die sich mit der fehlenden Beschleunigung bzw. sogar Verlangsamung bei der Nutzung mehrerer Threads beschäftigen lassen mich vermuten, dass mehrere Threads auf einem Prozessorkern laufen (wie zum Beispiel bei RealBasic/Xojo).
3. Wenn das zutrifft, wie kann ich einen neuen Prozessorkern "einführen"? Muss ich ein weiteres Programm bzw. eine neue Programminstanz starten?
Herzlichen Dank für jedwede Hilfe
Jens
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 17:41
von ts-soft
Das ganze hängt davon ab, wieviele Kerne haste, wie sind die Ausgelastet usw. Darüber brauchste Dir aber keine Gedanken machen,
das Betriebssystem sorgt autom. für eine Auslastung, die gut für das System ist. Wichtig ist nur, das Du versch. Threads erstellst, damit
das OS da auch eingreifen kann.
Man kann da auch eingreifen, aber wohl niemals Sinnvoll
Gruß
Thomas
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 18:03
von RSBasic
Du kannst mit der WinAPI-Funktion
SetThreadAffinityMask_() einzelne Threads pro Prozessorkern laufen lassen. Beispielcode:
Code: Alles auswählen
EnableExplicit
Procedure Thread1(z)
Protected a
SetThreadAffinityMask_(GetCurrentThread_(), 1)
Repeat
a = Random($FFFFFFF)*Random($FFFFFFF)*Random($FFFFFFF)
ForEver
EndProcedure
Procedure Thread2(z)
Protected a
SetThreadAffinityMask_(GetCurrentThread_(), 2)
Repeat
a = Random($FFFFFFF)*Random($FFFFFFF)*Random($FFFFFFF)
ForEver
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateThread(@Thread1(), 0)
CreateThread(@Thread2(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Mit
GetSystemInfo_() und
SYSTEM_INFO\dwNumberOfProcessors kannst du ermitteln, wie viele Prozessorkerne vorhanden sind:
Code: Alles auswählen
EnableExplicit
Define SYSTEM_INFO.SYSTEM_INFO
GetSystemInfo_(SYSTEM_INFO)
Debug SYSTEM_INFO\dwNumberOfProcessors
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 19:29
von Micha122
@RSBasic
Interessante Sache.
Auch sinnvoll?
Die Random Funktion führt auf meinem System zu einem Überlauf der Integer a......denke liegt daran das ich Windows 32bit benutze.
Grüße
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 19:37
von RSBasic
Micha122 hat geschrieben:Auch sinnvoll?
ts-soft hat grundsätzlich recht. Man sollte es lieber dem Betriebssystem überlassen. Manuelles Zuordnen ist nur in Spezialfällen sinnvoll, wenn die Performance dadurch verbessert wird.
Micha122 hat geschrieben:Die Random Funktion führt auf meinem System zu einem Überlauf der Integer a......denke liegt daran das ich Windows 32bit benutze.
Achso, ich habe es nur unter x64 getestet. Den Beispielcode habe ich angepasst.
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 19:56
von Micha122
@RSBasic
Hab´s vorhin vergessen: Danke für den Code.

Werde demnächst mal etwas damit experimentieren.
Mit GetSystemInfo_() und SYSTEM_INFO\dwNumberOfProcessors kannst du ermitteln, wie viele Prozessorkerne vorhanden sind:
Kann man nun sehen wie man möchte, aber eigentlich wird die Anzahl der Prozessor- Threads ausgegeben.
Nicht die Anzahl der tatsächlich vorhandenen Kerne(Hardware).
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 20:40
von jensknaack
Herzlichen Dank für die Informationen.
Wie schlau ist das Betriebssystem denn bei der Zuordnung eines Threads zu einem Prozessorkern? Dass ein neuer Thread nicht einem schon grenzwertig an 100%-Auslastungsgrenze entlangschrammendem Kern zugeordnet wird, kann ich mir gut vorstellen. Aber wird einem im Laufe der Zeit immer aufwändigerem Thread eventuell mal ein neuer Kern zugeordnet? Da vermute ich nein.
Infolgedessen könnte die händische Zuordnung durchaus mal sinnvoll sein?
Jens
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 21:42
von ts-soft
Infolgedessen könnte die händische Zuordnung durchaus mal sinnvoll sein?
Ich denke mal eher nicht. Um Deinen Thread auf einen anderen Kern "auszulagern" müßte dieser erstmal
beendet werden und ein neuer erstellt werden. Dieser Aufwand ist meist zu groß um irgendwas zu bewirken.
Das OS wird jetzt alle "neuen" Threads autom. einem anderem Kern zuordnen, so das sich dies von alleine
regelt.
Kerne zuordnen tun nur Leute, die viel Ahnung von nichts haben, um dann zu erreichen, das Ihr Super Duper Programm
einen Zacken schneller läuft, egal was mit den restlichen Programmen passiert. Ich denke mal, es gibt kaum Anwendungen,
die Vorrang vor anderen haben und nur Einsteiger denken immer, mein Programm muß richtig schnell laufen, laß die anderen
doch verrecken. So kann Multitasking nicht funktionieren. Ausnahme wären leistungshungrige Spiele, wobei man dann
besser die anderen Threads vorher beendet/pausiert.
Das OS hat als einziger den Überblick, was am besten für den Computer ist, da arbeiten viele Programmierer bereits seit
Jahrzehnten dran und verbessern es laufend.
Mein Rat: Laß die Finger davon! Mach lieber viele Threads, damit das OS diese gut verteilen kann und kümmere Dich
lieber um Threadsicherheit, da hast genug zu tun
Gruß
Thomas
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 22:07
von jensknaack
Das klingt überzeugend.
Also das Betriebssystem die Arbeit machen lassen.
Außerdem habe ich gerade gelesen, dass zumindest Linux in Ausnahmefällen einen Thread sogar automatisch auf einen anderen Kern verlagern kann. Windows wird das dann wohl auch können.
Purebasic habe ich erst vor kurzem entdeckt. Nicht nur die Sprache ist beeindruckend, sondern auch die schnellen, kompetenten und freundlichen Antworten in diesem Forum.
Herzlichen Dank.
Jens
Re: Mehrere Threads vs. mehrere Kerne
Verfasst: 12.03.2017 22:25
von GPI
Ich hatte mal einen Test gemacht (dieses a^2+3ab+b^2 Problem hier) und da haben Threads die Sache stark beschleunigt und es wurden auch alle Kerne belastet. Von daher, wenn du die Aufgabe in unabhängige Teile zerlegen kannst, nutzte Threads. Pass nur auf, das nicht auf gleiche Resourcen (linked list etc.) gleichzeitig zugegriffen wird.
Oder werden Linked List automatisch geschützt? Strings sind ohne entsprechende Compilereinstellung auch sehr kritisch!