Buttermilch schrieb:
https://www.pugetsystems.com/all_articles.php dort gibt es Skalierungsvergleiche bis 20cores mit diversen CPU Generationen von xeon haswell, multi cpu, Desktop i7 usw mit aktueller software die jetzt nicht
Auf jeden Fall ein interessanter link, danke sehr.
Cool Master schrieb:
Ich glaube damit ist/war eher gemeint es ergibt bei manchen Programmen einfach kein Sinn.
Zum einen das, aber bei anderem Programmen ist es schlicht nicht möglich, oder zumindest nur bei unbedeutenden Teilfunktionen (s. u. bei "Pacman"). Aber der wirtschaftliche Aspekt ist, wie du schon sagst, natürlich auch nicht zu vernachlässigen. Für ein Spiel, dass sich beispielsweise bei steam zehntausend mal für zehn Euro verkaufen lässt, lohnt sich so ein Aufwand nicht, selbst wenn es möglich wäre.
ascer schrieb:
: grober Unfug. .. ein Kasper .. Was ist das für ein Quark? .. Das ist doch ebenfalls Quark. .. So ein Quark. .. Wenn ich da immer so einen Quark höre .. Kein Kasper kann mir erzählen ..
Bevor ich auf dein längeren Beitrag antworte, bitte ich dich, doch zu einem sachlichen Tonfall zu finden und Kraftworte sowie Referenzen zu Handpuppen oder Milchprodukten zu unterlassen.
ascer schrieb:
Hier Amdahl's Law zu nennen ist grober Unfug. Erstens ist das ganze eine Theorie und grobe Approximation. Jedem sollte schnell klar sein, dass das keine wirkliche Gesetzmäßigkeit darstellt.
Wieso ist das Unfug? Es ist eine Abschätzung für den maximalen Geschwindigkeitsgewinn, der sich durch zusätzliche CPUs für ein Programm ergeben kann. Wo ist diese falsch oder Unfug?
Zweitens ist Amdahl's Law eine der pessimistischsten Herangehensweisen an Multi-Core-Software überhaupt
Ganz im Gegenteil, sie ist viel zu optimistisch, es werden nämlich weder die zusätzlichen Kosten für die Threaderzeugung berücksichtigt, noch die zusätzlichen Kosten für den Kommunikations- und Synchronisationsaufwand. Der Geschwindigkeitsgewinn wird in der Praxis also immer (deutlich) geringer ausfallen.
Ist euch eigentlich klar, dass jedweder Befehl, welcher mit dem Cache einer CPU auskommt, in wenigen Takten, das meiste sogar in 1-2 Takten, berechnet werden kann?
Ist euch weiterhin klar, dass die Auslagerung in den RAM, wenn es eben nicht in den Cache passt, meistens über 100 Takte benötigt? Wir sprechen hier also von einem Geschwindigkeitsverlust, der häufig grob mit dem Faktor 100 approximiert werden kann.
Dazu muss man dann nur noch wissen, dass mit mehr Kernen bisher immer ein linearer Anstieg des Caches einherging. Dadurch kann Software mit mehr Kernen nicht nur linear, sondern sogar supralinear beschleunigt werden.
Erstens ist der Zuwachs der Cachegröße eine Designentscheidung der CPU-Bauer und nicht zwangsweise gekoppelt an die Anzahl der Kerne. Zweitens produzieren mehr CPU-Kerne natürlich auch mehr Cache-misses, wenn der Cache nicht um den gleichen Faktor wie die Anzahl der CPU-Kerne wächst. Drittens müssen sich die ganzen Kerne leider immer noch den Speicherbus teilen, an der Stelle gibt es also einen zusätzlichen Engpass, da mehr Kerne nun mal auch häufiger auf den Speicher zugreifen wollen.
Und bevor jetzt ein Kasper exorbitante Cacheerhöhungen auf Single-Cores vorschlägt: bei Single-Core-CPUs limitert die Frequenz, die bekanntlich ab 4GHz nur noch schwer zu erhöhen ist. Ein riesiger Cache für einen Core würde also nichts bringen...viel Cache für viele Cores hingegen schon.
Was in aller Welt hat den jetzt die Taktfrequenz mit der Cachegröße zu tun? Natürlich bringt ein größerer Cache bei Singlecores etwas, nur steigt halt der Aufwand (Cachegröße) sehr viel stärker als der Gewinn, aber eben völlig unabhängig von der Taktfrequenz der CPU.
(Übrigens hat der
DEC Alpha von 1995 bis zu 64MB L3 Cache bei 266MHz Takt)
Erstmal ergeben mehrere Prozesse natürlich einen Speedup für den User. Was ist das für ein Quark? Wenn eine Anwendung in einem Tab läuft und sehr viel Ressourcen frisst, dann gibt es natürlich keinen Speedup.
Dir fällt schon auf, dass du dir hier selbst widersprichst?
Nichtsdestoweniger ist das ja aber wohl selten der Fall, dass ein einziger Tab eine ganze CPU auslasten würde.
Genau genommen lastet er die CPU so ziemlich gar nicht aus, wenn er die Seite gerendert hat. Es sei denn irgendein Script läuft Amok.
Der Otto* weiß im schlimmsten Fall selbstredend gar nichts mit Tabs anzufangen. Den interessiert die Performance ja aber sowieso nicht.
Also ich gehe bei Otto* von dem Durchschnittsnutzer bei seinen alltäglichen Aufgaben aus, nicht von jemanden, der damit überfordert ist, zu entscheiden, auf welche Seite vom Bildschirm er schauen soll.
Das ändert damit also auch nichts daran, dass beispielsweise ich genau deshalb mal von Firefox weg bin (als der noch alles in einem Prozess laufen ließ): ein Chrome schmiert dir eben auch mit 100 Tabs nicht ab
Ja, und warum macht er das? Weil er seine Tabs in Prozesse auslagert, somit jeder der Prozesse eine eigene Umgebung hat und untereinander geschützt ist. Firefox stopft dagegen alles in einen Prozessraum rein, weswegen ihm da oft auch schlicht einfach der Speicher ausgeht, und da er, abgesehen von dem Speicherlecks, auch recht buggy ist, stürzt er halt mit allen Tabs ab. Wenn bei Chrome hingegen ein Tab stirbt, stirbt nur dieses. Das hat aber nichts mit der Anzahl der CPU-Kerne zu tun. Hab ich jetzt aber auch schon mehr als einmal geschrieben.
Abgesehen davon: für JavaScript gibt es seit geraumer Zeit WebWorker. Damit kann man, selbst wenn der Browser selbst Javascript nur einen Thread spendiert, zusätzliche Threads innerhalb von JS spawnen. Wenn der Programmierer dieses Feature nicht nutzt, hat das doch gar nichts damit zu tun, dass es nicht schneller gehen würde.
Was ist denn "es" was jetzt schneller gehen würde?
Ich hab z.B. schon neuronale Netze mit JS libraries im Browser (einfach mal zum Testen) laufen lassen und kann euch sagen: das skaliert wunderbar.
Ich glaube, neuronale Netze in Javascript im Browser laufen zu lassen, ist ganz genau das, was Otto* jeden Tag macht.
Zu "einige Sachen lassen sich nicht parallelisieren": Das ist doch ebenfalls Quark. Natürlich gibt es Algorithmen, die sich nicht oder nur schlecht parallelisieren lassen
Hier widersprichst du dir schon wieder selbst. Liegt es am Milchprodukt?
Hier wird mit einigen Exoten aus der Wissenschaft argumentiert, dass Parallelisierung ungemein schwierig wäre. So ein Quark.
Tja, Parallelisierung ist aber nun mal nicht einfach, das ist ganz und gar nicht exotisch.
Um nur mal ein super banales Beispiel zu nennen: Ich habe als Training im dritten Semester ein Pacman programmiert in C++11, wo jeder der vier Geister in einem eigenen Thread lief, sowie Pacman selber und die Spielwelt. Mit ein, zwei Hintergrundgeschichten und Syncen war es am Ende ein 8-Core Pacman.
Ist ja jetzt ganz wunderbar, nun sag mir doch mal wie hoch der Geschwindigkeitsgewinn zur Singlecoreversion ist (Nur zur Erinnerung, Pacman lief schon auf 8Bit CPUs perfect).
Ich weiß, dass das nur ein Beispiel ist, aber nehmen wir doch mal an, dass das was du getan hast sinnvoll wäre und du hast jetzt tatsächlich mit den vier Geistern vier Cores , plus weitere vier für irgendwelche "Hintergrundgeschichten", also acht Kerne voll ausgelastet. Und jetzt lässt du das ganze mal auf einer 16C CPU laufen. Was passiert? Dein Programm wird kein deut schneller, es skaliert null mit weiteren Kernen. Soviel zum Thema Exotik. Dein Beispiel ist viel mehr ein Beispiel dafür, dass Parallelisierung eben nicht beliebig möglich ist.
Natürlich wird darauf direkt ein Argument wie "ein Crysis zu parallelisieren ist aber schwieriger, als einfach Geister in Pacman parallel laufen zu lassen, wegen mehr Abhängigkeiten" kommen.
Ja, natürlich ist das so.
Ja natürlich kommt das Argument. Und wenn es die Abhängigkeiten im kritischen Pfad nicht zulassen, können das auch hunderte von Mitarbeitern nicht ändern.
Aber: arbeitet an Crysis auch nur ein Student im dritten Semester? Oder vielleicht ein paar Zehn oder Hundert Entwickler, im besten Fall fertige Absolventen, die sich gefälligst mit Parallelisierung auseinandergesetzt haben?
Wenn ich da immer so einen Quark höre, man könne Games nicht beliebig parallelisieren, deshalb werden nicht mehr als 4 Kerne unterstützt. Oder Speedup wäre zu gering. Der Speedup ist vielleicht bei 400 oder 4000 Kernen nicht mehr gegeben, wenn irgendwann alles im Cache liegt und man bei auch nur einem einzigen Thread mehr in der Sync-Hölle landet. Bis dahin ist es einfach nur mehr Entwicklungsaufwand, eine vernünftige Parallelisierung zu schreiben.
Dann mal die Gegenfrage, wenn Parallelisierung der Game-Engine so einfach oder überhaupt möglich wäre, glaubst du wirklich, man hätte das nicht längst getan? Bei einem AAA-Titel mit zig Mitarbeitern und Multimillionen $ Budget sollte das doch dann ein leichtes sein, oder glaubst du, dass dort nur inkompetente Deppen sitzen oder zu faul sind?
Ganz klar: das war angepasste Software, hatte einen limitierten (nur "rumfliegen" oder Blöcke "hin- bzw. wegklicken") Anwendungsbereich usw. Ebenso nur Singleplayer, sobald man Multiplayerzeugs hat wird die Parallelisierung natürlich noch aufwendiger.
Ich kenne das Programm deines Freundes nicht, auch will ich ganz sicher nicht seine Leistung schmälern. Aber wie du selbst sagst, ist das ganze sehr rudimentär, keine Gegner, keine Interaktionen, letztendlich nur eine Art 3D-Paint, wo du den Cursor bewegen kannst und einzelne Blöcke setzen und löschen kannst.
Kein Kasper kann mir erzählen, Spiele wären nicht vernünftig parallelisierbar.
Wie gesagt, die Kunst besteht darin, die Abhängigkeiten im kritischen Pfad so aufzulösen und auf unabhängige Teilaufgaben zu verteilen, dass mehrere Kerne ausgelastet werden können. Einfach nur ein paar Partikeleffekte rauszunehmen, oder die Physikberechnungen auf die GPU zu verlagern hilft da halt nicht weiter, weil das eben nicht reicht um auf eine beliebige Anzahl von Kernen zu skalieren. Offenbar ist das also nicht so trivial, wie du das hier versuchst darzustellen, wenn es denn tatsächlich möglich wäre, dann ist es doch erheblicher Aufwand, der letztendlich bezahlt werden muss, und deswegen nur bei einer geringen Zahl von Titeln mit entsprechendem Budget möglich ist.