Mehrere Threads vs. mehrere Kerne

Anfängerfragen zum Programmieren mit PureBasic.
jensknaack
Beiträge: 8
Registriert: 03.01.2017 18:28

Mehrere Threads vs. mehrere Kerne

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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 :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Mehrere Threads vs. mehrere Kerne

Beitrag von Micha122 »

@RSBasic
Hab´s vorhin vergessen: Danke für den Code. :allright: Werde demnächst mal etwas damit experimentieren. :D
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).
Barcodes for PureBasic - http://micha122.bplaced.net/
jensknaack
Beiträge: 8
Registriert: 03.01.2017 18:28

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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 :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
jensknaack
Beiträge: 8
Registriert: 03.01.2017 18:28

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Mehrere Threads vs. mehrere Kerne

Beitrag 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!
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten