Multithreading, volatile, Cache usw.



  • knivil schrieb:

    1.) I$ braucht nicht geshared sein.
    2.) D$ soll nicht geshared sein, da mehrere Prozesse unterschiedliche Daten verarbeiten. Warum soll mein Videoplayer den gleichen Cache benutzen, wie mein Videospiel, dass nebenbei laeuft? Also konsistente Caches bringen nur in wenigen Faellen etwas, z.B. Supercomputing. Dafuer gibts dann von Intel Larrabee/Knights Corner (ka. wie es final heissen wird).

    Wenn alle Prozessoren auf dem selben Cache arbeiten, dann sind die Daten doch automatisch konsistent.

    Die Schwierigkeiten ergeben sich bei der Realisierung. Multithreading ist normalerweise so gestrikt, dass eben nicht auf den gleichen Daten gearbeitet wird.

    Und das würde ja auch nichts machen.
    Die Konsistenz diesem gemeinsamen Cache kommt ja "for free", die kostet nix.



  • Die Konsistenz diesem gemeinsamen Cache kommt ja "for free", die kostet nix.

    Wenn Prozess A den Cache von Prozess B immer kaputt macht als auch anders herum, dann arbeitet Programm A und B langsamer, als wenn sie einen getrennten Cache benutzen. Nix ist for free!



  • jenz schrieb:

    PhilippHToner schrieb:

    Is des jetzt so schwer? Google mal: Datenkonsistenz. Wie willst du eine Datenkonsistenz in einem gemeinsamen Cache realisieren ...
    // edit Zusatz: bei gleicher Geschwindigkeit!

    Ach komm, darum geht es doch gar nicht.

    Wenn alle Prozessoren auf dem selben Cache arbeiten, dann sind die Daten doch automatisch konsistent. Also sehen wir mal von den Registerwerten ab.

    Nein!!!!!! Der Prozessor addiert keine Werte aus dem Cache direkt zusammen und schreibt sie wieder in den Cache so ein Blödsinn! Er braucht alles erst einmal in einem Register um damit was machen zu können!!!!! Programmier Mal Assembler! Google, was eine ALU macht!



  • @jenz:

    okay, wenn man mehr als nur seinen xten teil nutzen können soll, dann wird die verwaltung aufwendiger. dann sollte man den cache doch besser in gleiche teile aufteilen auf denen immer nur ein prozessor die hoheit hat.

    Aehm also eigentlich wie getrennte Caches! Auch deine anderen Argumente sind eher ... undurchdacht.

    "Destructive interference—the converse of overlapping working sets"
    haben wir ja schon gelöst

    Ja, mit getrennten Caches.

    wieviel Zukunft unsere Multicore CPUs haben. Nämlich 0! Mit zunehmender Frequenz steigt die Hitzeentwicklung

    Die Anzahl der Kerne hat nichts mit der Frequenz zu tun.



  • PhilippHToner schrieb:

    jenz schrieb:

    PhilippHToner schrieb:

    Is des jetzt so schwer? Google mal: Datenkonsistenz. Wie willst du eine Datenkonsistenz in einem gemeinsamen Cache realisieren ...
    // edit Zusatz: bei gleicher Geschwindigkeit!

    Ach komm, darum geht es doch gar nicht.

    Wenn alle Prozessoren auf dem selben Cache arbeiten, dann sind die Daten doch automatisch konsistent. Also sehen wir mal von den Registerwerten ab.

    Nein!!!!!! Der Prozessor addiert keine Werte aus dem Cache direkt zusammen und schreibt sie wieder in den Cache so ein Blödsinn! Er braucht alles erst einmal in einem Register um damit was machen zu können!!!!! Programmier Mal Assembler! Google, was eine ALU macht!

    Das ist mir klar und steht hier überhaupt nicht zu debatte.



  • knivil schrieb:

    wieviel Zukunft unsere Multicore CPUs haben. Nämlich 0! Mit zunehmender Frequenz steigt die Hitzeentwicklung

    Die Anzahl der Kerne hat nichts mit der Frequenz zu tun.

    Ich meinte damit, dass wir weg von Multicore, hin zu niedriggetakteten Manycore kommen werden, blöd bin ich auch nicht! Weniger Hitzeentwicklung bedeutet auch weniger Strom.



  • knivil schrieb:

    Die Konsistenz diesem gemeinsamen Cache kommt ja "for free", die kostet nix.

    Wenn Prozess A den Cache von Prozess B immer kaputt macht als auch anders herum, dann arbeitet Programm A und B langsamer, als wenn sie einen getrennten Cache benutzen. Nix ist for free!

    Ja, das ist auch klar.
    Aber das hat doch auch nichts mit dem Problem hier zu tun.



  • jenz schrieb:

    PhilippHToner schrieb:

    jenz schrieb:

    PhilippHToner schrieb:

    Is des jetzt so schwer? Google mal: Datenkonsistenz. Wie willst du eine Datenkonsistenz in einem gemeinsamen Cache realisieren ...
    // edit Zusatz: bei gleicher Geschwindigkeit!

    Ach komm, darum geht es doch gar nicht.

    Wenn alle Prozessoren auf dem selben Cache arbeiten, dann sind die Daten doch automatisch konsistent. Also sehen wir mal von den Registerwerten ab.

    Nein!!!!!! Der Prozessor addiert keine Werte aus dem Cache direkt zusammen und schreibt sie wieder in den Cache so ein Blödsinn! Er braucht alles erst einmal in einem Register um damit was machen zu können!!!!! Programmier Mal Assembler! Google, was eine ALU macht!

    Das ist mir klar und steht hier überhaupt nicht zu debatte.

    Ja doch, du kommst mit deinem tollen SharedCache her aber dass der ganze Müll auch in Registern ist, ist dir Wurst? Willst du jetzt mit SharedRegistern arbeiten 😃



  • Ja, das ist auch klar. Aber das hat doch auch nichts mit dem Problem hier zu tun.

    Doch. der wie willst du entscheiden, wie viel Cache ein Prozess benutzen darf?



  • knivil schrieb:

    @jenz:

    okay, wenn man mehr als nur seinen xten teil nutzen können soll, dann wird die verwaltung aufwendiger. dann sollte man den cache doch besser in gleiche teile aufteilen auf denen immer nur ein prozessor die hoheit hat.

    Aehm also eigentlich wie getrennte Caches! Auch deine anderen Argumente sind eher ... undurchdacht.

    "Destructive interference—the converse of overlapping working sets"
    haben wir ja schon gelöst

    Ja, mit getrennten Caches.

    wieviel Zukunft unsere Multicore CPUs haben. Nämlich 0! Mit zunehmender Frequenz steigt die Hitzeentwicklung

    Die Anzahl der Kerne hat nichts mit der Frequenz zu tun.

    Bei getrennten Caches brauche ich doch ein cache kohärenz protokoll, also ein verfahren dass über die caches hinweg die gleichen daten in die caches schreibt.

    wenn jeder prozessor aber gleich in allen bzw in dem einen großen cache lesen kann, dann braucht man das eben nicht.



  • knivil schrieb:

    Ja, das ist auch klar. Aber das hat doch auch nichts mit dem Problem hier zu tun.

    Doch. der wie willst du entscheiden, wie viel Cache ein Prozess benutzen darf?

    Wieso denn eigentlich Prozess?
    Wir reden doch über Prozessoren und ihre L1 Caches.

    Aber das ist auch interessant.
    Kann man einem Prozess einen bestimmten Teil vom Cache zuordnen?



  • jenz schrieb:

    Bei getrennten Caches brauche ich doch ein cache kohärenz protokoll, also ein verfahren dass über die caches hinweg die gleichen daten in die caches schreibt.

    wenn jeder prozessor aber gleich in allen bzw in dem einen großen cache lesen kann, dann braucht man das eben nicht.

    Des gilt nur für L3, weil shared! und ist im Hintergrund! Und das "Protokoll" ist schneller als ein RAM Zugriff!



  • Du brauchst immer ein Protokoll wenn mehrere Einheiten auf einen gemeinsamen Speicher zugreifen. http://de.wikipedia.org/wiki/Arbiter . Das gleiche Problem tritt ja auch auf, wenn mehrere DMA-Engines auf den RAM zugreifen.

    Wieso denn eigentlich Prozess?

    Einem Prozessor, der nichts macht, ist es egal ob er einen getrennten Cache benutzt oder nicht.



  • jenz schrieb:

    knivil schrieb:

    Ja, das ist auch klar. Aber das hat doch auch nichts mit dem Problem hier zu tun.

    Doch. der wie willst du entscheiden, wie viel Cache ein Prozess benutzen darf?

    Wieso denn eigentlich Prozess?
    Wir reden doch über Prozessoren und ihre L1 Caches.

    Aber das ist auch interessant.
    Kann man einem Prozess einen bestimmten Teil vom Cache zuordnen?

    Er meint Prozessor, aber das lässt sich über Heuristiken lösen. Hitrates, oder letzte Zugriffszeit



  • jenz schrieb:

    Und was ich eben noch nicht verstehe:
    Warum sollte der gleichzeitige parallele Zugriff auf einen gemeinsamen Cache so problematisch sein? Also rein vom Prinzip her stelle ich mir dir Frage.

    Klar wird der Cache immer dicker, wenn er mehr Leitungen hat, aber das ist doch kein prinzipielles Problem.

    Für nur lesen wäre das vielleicht noch denkbar (aber eher nicht, siehe weiter unten).

    Aber wie willst du in so einen Cache schreiben?

    Jeder "gute" Cache ist "multi-way associative", d.h. jede RAM Adresse kann an verschiedenen Stellen im Cache liegen. D.h. es gibt hier gewisse Registerbänke die "Verwaltungsdaten" enthalten. Es wird z.B. auch vermerkt wann eine Cache-Line das letzte mal verwendet wurde, damit entschieden werden kann welche Lines rausfliegen wenn neue Daten dazukommen.
    Um also einen neuen Wert in den Cache zu tun muss man erstmal folgendes machen:
    * In allen Cache-Lines die in Frage kommen nachgucken wie alt sie sind
    * Die älteste ermitteln
    * Diese Cache-Line ggf. in den Speicher (oder darunterliegenden Cache) zurückschreiben
    * Die neuen Daten in die Cache-Line stecken
    * Den "letzer Zugriff" Wert aktualisieren

    Wie soll das funktionieren wenn das 2 Cores gleichzeitig machen sollen?

    Und nochmal zurück zum "nur gleichzeitig lesen, und nur einer darf schreiben" Gedankenexperiment: wie willst du das alles synchronisieren, so dass während ein Cache-Update im Gange ist, die lesenden Cores nicht Mist lesen?

    Und zwar so synchronisieren, dass alles 100% gleich schnell bleibt?

    Zeig mir eine CPU mit shared L1 Cache, und ich zeig dir eine CPU die Performance verschenkt.



  • PhilippHToner schrieb:

    Ja doch, du kommst mit deinem tollen SharedCache her aber dass der ganze Müll auch in Registern ist, ist dir Wurst? Willst du jetzt mit SharedRegistern arbeiten 😃

    Man PhillipHToner,

    es geht um die Konsistenz zwischen den L1 Caches...

    Die Register sind mal längst völlig uninteressant.



  • jenz schrieb:

    es geht um die Konsistenz zwischen den L1 Caches...
    Die Register sind mal längst völlig uninteressant.

    Mein NOT-Shared L1 Cache braucht gar nix bzgl. Konsistenz und wenn doch, dann kümmert sich dass OS darum, weil ich in meinem Programm explizit ein Mutex locke.

    Dein Shared L1 Cache hat mein geschildertes Problem!!



  • hier drin scheint es genau darum zu gehen:

    http://www.springerlink.com/content/mx6683v800477x13/

    collective cache

    such ich mal nach



  • BTW: die Konsistenz zwischen den Caches ist auch kein eigentliches Problem, da gibt es schöne Lösungen die gut funktionieren und vor allem auch ohne extrem viel Performance zu kosten. z.B. MESI

    http://en.wikipedia.org/wiki/MESI_protocol



  • PhilippHToner schrieb:

    jenz schrieb:

    es geht um die Konsistenz zwischen den L1 Caches...
    Die Register sind mal längst völlig uninteressant.

    Mein NOT-Shared L1 Cache braucht gar nix bzgl. Konsistenz und wenn doch, dann kümmert sich dass OS darum, weil ich in meinem Programm explizit ein Mutex locke.

    Dein Shared L1 Cache hat mein geschildertes Problem!!

    ich glaube, dass hier ist ein guter Anfang für dich:
    http://de.wikipedia.org/wiki/Cache-Kohärenz


Anmelden zum Antworten