Entwickeln für Multicore-Prozessoren - Wo ist das Problem ?



  • Hallo,
    ich befasse mich grade mit der Thematik Multicore-Prozessoren. Dabei bin ich auf Wikipedia auf diese Aussage gestoßen:

    "Anders betrachtet kann mit der gleichen Anzahl an Chip-Sockeln und Chips theoretisch eine vervielfachte Rechenleistung erzielt werden (das Zweifache bei Doppelkernen). In der Realität kann diese Steigerung jedoch nie erreicht werden, die Leistungssteigerung schwankt, je nach Programm zwischen nicht vorhanden (bei nicht auf Mehrkernprozessoren ausgelegter Software) und fast 100 % (bei stark optimierter Software)."

    Klar ist, dass die Vervielfachung natürlich wirklich nur theoretisch ist, da es zur Koordination des Programmflusses natürlich einen Overhead gibt. Aber selbst wenn ich jetzt mal annehme, dass dieser Overhead sehr groß ist, kann ich mir nicht vorstellen, dass es bei einer "nicht darauf ausgelegten" Software KEINE Leistungssteigerung gibt.

    Ich verstehe ehrlich gesagt nicht, wo das Problem liegt (daher auch der Threadtitel 😃 ). Windows teilt doch ständig den unterschiedlichen Prozessen CPU Zeit zu. Diese Systematik müsste doch einfach dahingehend erweiterbar sein, dass es eben nicht die komplette CPU sondern die unterschiedlichen Kerne an die Prozesse verteilt. Also praktisch eine Lösung auf Betriebssystemebene. Ich kann mir nicht vorstellen, dass die Zukunft darin bestehen soll, für Quad-(oder eventuell bald noch mehr ??)-Core-CPUs optimierte Software zu entwickeln...

    1)Wo ist mein Denkfehler ?

    2)Wie sieht eine auf Multicore zugeschnittene Software aus ? Vielleicht ein paar triviale Beispiele zur Veranschaulichung ? Ich hab zwar mal ne zeitlang entwickelt aber das ist mir irgendwie zu hoch...

    Danke

    Max

    P.S.: warum wurde das als "potentieller Spam-Eintrag" markiert ?



  • Max3 schrieb:

    1)Wo ist mein Denkfehler ?

    2)Wie sieht eine auf Multicore zugeschnittene Software aus ? Vielleicht ein paar triviale Beispiele zur Veranschaulichung ? Ich hab zwar mal ne zeitlang entwickelt aber das ist mir irgendwie zu hoch...

    1. Dein Denkfehler ist, dass Du nicht realisiert hast, was "nicht darauf ausgelegt" bedeutet. Das bedeutet nämlich, dass das Programm völlig sequentiell geschrieben ist. Die Nutzung mehrerer Kerne bedeutet aber gerade, dass man mit Parallelität arbeitet. Entsprechend können mehrere Kerne auch nur von Programmen genutzt werden, in denen Programmteile parallelisiert wurden.

    2. Eine auf Multicore zugeschnittene Software sieht so aus, dass die kritischen Programmteile parallelisiert sind. Und zwar so, dass die unterschiedlichen Threads möglichst jeweils nur einen sehr geringen Speicherbedarf haben bzw. im gleichen kleinen Speicher arbeiten. Der Zusatz mit dem Speicher ist hierbei im Kontrast zu einer Parallelisierung für Cluster zu sehen. Dort sollten die Prozesse möglichst auf völlig getrennte Speicherbereiche zugreifen. Der Grund für diese unterschiedliche Parallelisierung bei Multicore-Prozessoren und Clustern ist die unterschiedliche Speicheranbindung. Bei einem Multicore-Prozessor hast Du einen Cache, den sich die unterschiedlichen Threads teilen. Der Flaschenhals liegt hierbei in der Verbindung zwischen Cache und Arbeitsspeicher. Wenn die Threads nun alle völlig unterschiedliche Speicherbereiche nutzen, dann wird diese Verbindung schnell überlastet. Beim Cluster ist das anders. Dort hast Du keinen geteilten Cache, der unter den Prozessen aufgeteilt wird. Stattdessen hast Du für jeden Prozess einen separaten Cache und sogar einen separaten Arbeitsspeicher. Der Flaschenhals ist hier die Verbindung zwischen den unterschiedlichen Arbeitsspeichern durch ein Netzwerk. Es ist deshalb wichtig, dass hier möglichst wenig Synchronisierung stattfindet. Und deshalb sollten die Prozesse nicht auf die gleichen Speicherbereiche schreiben.



  • Max3 schrieb:

    P.S.: warum wurde das als "potentieller Spam-Eintrag" markiert ?

    Registriere dich, und du solltest damit kein Problem bekommen.



  • Max3 schrieb:

    [...] die unterschiedlichen Kerne an die Prozesse verteilt. Also praktisch eine Lösung auf Betriebssystemebene.

    Das geschieht ja schon längst, Prozesse werden auf den verschiedenen Kernen verteilt. Wenn man zwei Prozesse hat, die durchgängig arbeiten, dann ist ein Dual-Core-Prozessor auch zu 100% ausgelastet. Das Problem ist aber, dass man meist nur genau einen Prozess laufen hat, der viel Rechenleistung benötigt (z.B. mathematische Berechnung oder Spiel), und wenn in diesem Prozess die Rechenleistung nicht händisch auf verschiedene Threads ausgelagert wird, ist ein Quad-Core z.B. nur zu 1/4 ausgelastet. Deshalb müssen Berechnungen eben von Hand auf Threads aufgeteilt werden, den Rest hat ja Gregor schon geschrieben.



  • Max3 schrieb:

    Ich verstehe ehrlich gesagt nicht, wo das Problem liegt (daher auch der Threadtitel 😃 ). Windows teilt doch ständig den unterschiedlichen Prozessen CPU Zeit zu. Diese Systematik müsste doch einfach dahingehend erweiterbar sein, dass es eben nicht die komplette CPU sondern die unterschiedlichen Kerne an die Prozesse verteilt. Also praktisch eine Lösung auf Betriebssystemebene.

    Das Betriebssystem versteht die Logik in deinem Programm nicht, darum kann es nicht einfach sagen hier sind 8 Operationen die normal nacheinander ausgeführt werden, aber ich hab 8 Cores, also führ ich sie gleichzeitig aus. Es kann ja sein, dass die 6te Operation was braucht was von der 4ten verändert wird und somit wäre das Ergebniss der 6te falsch, wenn sie ausgeführt wird vor die 4te fertig ist.



  • Danke, habs verstanden



  • ich find das ist ein interesantes thema

    wenn es dich weiter interessiert kansnt dir ja mal die vor und anchteile von threads angucken (hab hier irgendwo mal nen artikel gesehen glaub ich)

    statt threads kannste dir eig prozesse je nachdem dneken und halt mehrere prozessoren bzw kerne...


Anmelden zum Antworten