Mein Coding Blog, Wiener-Würstchen-Niveau, C++11, Optimierung, etc...



  • Dein Blog ist Provokation pur!



  • Bashar schrieb:

    Anderes Beispiel, angelehnt an deins: Was verstehst du unter einer Wiener Schmähkritik?

    Kenn ich als Redewendung jetzt nicht. Mag sein dass ichs mal irgendwo gehört habe, aber pfuh.
    Ohne weiteren Kontext würde ich vermuten: eine unsachgemäss schlechte Kritik, ausgesprochen von einem Wiener, zu irgend einer Sache die er nicht mag.
    Mir fehlt aber auch hier wieder der Zusammenhang - ich verstehe nicht was du damit sagen willst (aber vielleicht kommt das ja noch).

    EDIT2: genau genommen hab ich sogar nachgefragt. Was meinst du was das "und?" darstellt.

    Maximal die Andeutung einer rhetorischen Frage.

    Naja der 😕 war in meinen Augen ein deutlicher Hinweis darauf dass ich nicht verstehe was du damit sagen willst.
    Das Beispiel sollte verdeutlichen dass es für mich ganz normal ist, dass zwei Wörter in vertauschter Reihenfolge was anderes bedeuten.
    (Und wenn es noch dazu nichtmal die selben Wörter sind, sondern nur der selbe Wortstamm, ist es noch weniger verwunderlich für mich.)



  • hustbaer schrieb:

    Bashar schrieb:

    Anderes Beispiel, angelehnt an deins: Was verstehst du unter einer Wiener Schmähkritik?

    Kenn ich als Redewendung jetzt nicht. Mag sein dass ichs mal irgendwo gehört habe, aber pfuh.
    Ohne weiteren Kontext würde ich vermuten: eine unsachgemäss schlechte Kritik, ausgesprochen von einem Wiener, zu irgend einer Sache die er nicht mag.
    Mir fehlt aber auch hier wieder der Zusammenhang - ich verstehe nicht was du damit sagen willst (aber vielleicht kommt das ja noch).

    Eine Schmähkritik ist eine kritische Äußerung die alleine dazu dient, das Gegenüber zu schmähen, der Schmach auszusetzen. Was eine "Wiener Schmähkritik" konkret bedeutet, mag ich mir daraus aber nicht zusammenreimen müssen. Worauf Bashar hinauswill ist schlicht, daß man neben der "Schmähkritik" unweigerlich auch den "Wiener Schmäh" sozusagen "mitliest": Eine Kritik, die mit einer gesunden Priese ebendessen gewürzt ist.



  • Swordfish schrieb:

    Worauf Bashar hinauswill ist schlicht, daß man neben der "Schmähkritik" unweigerlich auch den "Wiener Schmäh" sozusagen "mitliest": Eine Kritik, die mit einer gesunden Priese ebendessen gewürzt ist.

    Es mag sein dass es Leute gibt, denen das so geht, wobei es mich sehr wundern würde.

    Mir geht es nämlich nicht so. Ich lese entweder das eine oder das andere. Dabei mache ich durchaus mal Fehler, aber ich lese nicht irgendwie ein wenig von beidem.

    Mir ist mittlerweile glaube ich auch klar was er meint. Was ich dagegen immer noch nicht verstehe ist dass man das als etwas besonderes, erwähnenswertes empfindet. Und wenn das was er gemeint hat nicht erwähnenswert ist (was es für micht nicht ist), dann bleibt für mich bloss noch eine andere Auslegung übrig. Und die wäre wirklich total dämlich gewesen (daher auch das "Ich wollte nicht wahr haben dass man so dumm sein kann").



  • Hier is ja was los. Darf ich fernab von der entfachten Fehde mal was einwerfen?

    Auch nur so, weils mich wirklich interessiert, und weil Hustbaer vor knapp 2 Tagen ein exzellentes Gegen-Beispiel gebracht hat für die Grenzen meiner damaligen Aussage:

    ich schrieb:

    performance-messung: kommt doch immer auf den anwendungszweck der funktionalität an, ich find landau-symbolik und auseinandergenommene operationen bis kurz vor assembly-level eigentlich immer aussagekräftiger.

    Vielleicht sei aber vorher trotzdem noch etwas gesagt, und ich erwähne dies nur, um nach der entstandenen Debatte die hitzigen Köpfe hoffentlich etwas abzukühlen vor ihrer Antwort: Ich würde und werde in diesem Forum nie auf das rhetorische Mittel "Argumentum-ad-Hominem" zurückgreifen. Und nichtmal das ist als Argumentum-ad-Homini zu verstehen. hustbaer versteht definitiv weitaus mehr von Programmierung als ich je könnte (und ihr andern bestimmt auch alle, aber zeigt das ma lieber). Und solange hustbaers Antworten so konstruktiv sind wie bisher, bin ich schlichtweg begeistert und würdige dies natürlich.

    Nun gut, also Back to Topic:
    Das komplette Gegenbeispiel findet sich wieder auf Seite 3.
    Hier nochma die beiden Algorithmen, um die es geht:

    A

    Input: Bild[Breite, Höhe]
    Output: Bild[Breite, Höhe / 4]
    
    Für alle Zeilen z in Input, Step 4
        Für alle Spalten s in Input
            Output[s, z / 4] = (Input[s, z] + Input[s, z + 1] + Input[s, z + 2] + Input[s, z + 3]) / 4
    

    B:

    Input: Bild[Breite, Höhe]
    Output: Bild[Breite, Höhe / 4]
    Puffer: Zeile[Breite]
    
    Für alle Zeilen z in Input
        Wenn (z modulo 4) gleich 0
            Für alle Spalten s in Input
                Puffer[s] = Input[s, z]
        Wenn (z modulo 4) gleich 1 oder 2
            Für alle Spalten s in Input
                Puffer[s] = Puffer[s] + Input[s, z]
        Wenn (z modulo 4) gleich 3
            Für alle Spalten s in Input
                Output[s, z / 4] = (Puffer[s] + Input[s, z]) / 4
    

    B ist oftmals schneller als A, warum?

    Ich hab da mal ein bisschen drüber nachgedacht.
    Hier ein paar Kommentare, und ich bitte die Leser darum, mich zu korrigieren, wenn ich falsch liege:

    Auf modernen CPUs mit Pipelining kommen dem Algorithmus A wohl die sogenannten Pipeline Hazards in die Quere.
    In der Variante A findet die gesamte Arithmetik direkt auf den Input-Values statt.
    In der Variante B werden die Input Values teilweise erst auf den Stack gepackt (der hoffentlich durch den Cache gebildet wird).
    (Puffer). Dann wird etappenweise darauf darauf gerechnet.
    Schlussendlich werden die Resultate dann wieder in Output zurückgeschrieben.
    Da in Variante B die Vorgänge "Speicher-Lesen", "Rechnen", "Zurückschreiben" etwas autonomer in sich vonstatten gehen, liegt hier wohl der Geschwindigkeits-Vorteil.
    In Variante A hingegen prasseln die Schreibvorgangs-Granaten direkt hinter die Lesen+Rechnen-Vorgänge. Zumindest direkter als bei B.

    Nun denn, wenn ich bisher richtig liege, lehne ich mich jetzt wirklich mal weit und nur spontan aus dem Fenster:
    Ein weiterer Optimierungsschritt könnte vielleicht folgender sein: Wir versuchen den Geschwindigkeits-Vorteil, den wir durch den Puffer erzielen, noch weiter auszubauen: Vielleicht passen, je nach Ziel-Architektur und Ziel-Zweck sogar 2 x Puffer auf einmal in den Cache (wenn man zum Beispiel sicher weiss dass das Programm eh grad den komplette PC in Beschlag nimmt, z.B. durch einen Lade-Bildschirm).
    Der Output in der äusseren Schleife (also wenn einmal alle Modulo Zweige abgefeiert wurden) ist ja nich abhängig vom bisherigen Input.
    Wenn ich mir diese Nicht-Abhängigkeit von Input und Output in der äusserern Schleife, kommt mir grad auch noch folgendes in denn Sinn: Könnte man den Algorithmus hier nicht sogar gut in Open-MP verwursten? Und das ganze dadurch sogar (hoffentlich) paralellisieren?!?

    Zurück zur Sache, und zwar zur Darstellung:
    Um die Performance-Aussage eines Algorithmus mit den hier gezeigten abhängigen (sagen wir besser: optimierbaren) Sequenzen irgentwie anschaulich darzustellen, fehlen zumindest mir nun die Mittel.

    Einen kleinen Schritt in die richtige Richtung will ich trotzdem nicht unversucht lassen:
    Vielleicht macht es sinn, die Lese/Schreib Operationen in Load/Store (Input/Output) und Load-Lokal/Store-Lokal (Puffer) zu unterteilen:

    Das ergäbe für den Algorithmus B dann folgendes:

    B
    [code]
    (Höhe) mal:
        1 "Loop-Control"    (die äussere Schleife)
    
    (Höhe / 4) mal:         (der "(z modulo 4) gleich 0" Teil)
        Breite mal:
            1 "Loop-Control"
            1 Load
            1 Store-Local
    
    (Höhe / 2) mal:         (der "(z modulo 4) gleich 1 oder 2" Teil)
        Breite mal:
            1 "Loop-Control"
            1 Load-Local
            1 Load
            1 Add
            1 Store-Local
    
    (Höhe / 4) mal:         (der "(z modulo 4) gleich 3" Teil)
        Breite mal:
            1 "Loop-Control"
            1 Load-Local
            1 Load
            1 Add
            1 Shift
            1 Store
    ------------------------------
    
    "Loop-Control":    Höhe * (Breite + 1)
    Load-Local:        Höhe * Breite * 3/4
    Store-Local:       Höhe * Breite * 3/4
    
    Load:              Höhe * Breite
    Store:             Höhe * Breite / 4
    
    Add/Shift:         Höhe * Breite
    

    Das spricht natürlich immer noch für die Variante A.
    Aber zumindest bei den Load/Store's kommt man so auf die gleiche Anzahl.

    Meine finale Schlussfolgerung:
    Da sich Optmierungen, die sich durch die Sequenz der Operationen ergeben, wie z.B. das Pipelining auf modernen x86 CPUs, zumindest für mich aktuell nicht anschaulich darzustellen sind, scheint die Performanz-Hauptaussage eines Algorithmus immer noch in den letzendlichen Messungen zu liegen, in nächster Instanz vielleicht noch der Algorithmus selbst (als Pseudocode) in Kombination mit der Ziel-Architektur.

    Gruß, Gero

    Edit: Die derbsten Rechtschreibfehler gefixt.
    Edit2: Ein bisschen umformuliert, +Rechtschreibung.



  • @Gero_Programmierstil_de performance ist total unwichtig... darüber macht man sich erst gedanken, wenn das teil lahmt sonst wird man nie fertig!

    ich kenn mich damit relativ gut aus, daher der hinweis 😉



  • btw. groß- und kleinschreibung ist hier total gern gesehen. sonst wirst du immer mal wieder verbannt, auch dafür bin ich spezialist 😉



  • hustbaer schrieb:

    Bashar schrieb:

    Anderes Beispiel, angelehnt an deins: Was verstehst du unter einer Wiener Schmähkritik?

    Kenn ich als Redewendung jetzt nicht.

    Hab ich mir auch ausgedacht.

    Mir fehlt aber auch hier wieder der Zusammenhang - ich verstehe nicht was du damit sagen willst (aber vielleicht kommt das ja noch).

    Dass ich "heads-level" für eine komische Wortwahl halte, weil dort der Begriff "level-headed" mitschwingt. Das ist jetzt kein Drama, aber wieso muss ich mich eigentlich über 2 Seiten dafür rechtfertigen, was gepostet zu haben?

    EDIT2: genau genommen hab ich sogar nachgefragt. Was meinst du was das "und?" darstellt.

    Maximal die Andeutung einer rhetorischen Frage.

    Naja der 😕 war in meinen Augen ein deutlicher Hinweis darauf dass ich nicht verstehe was du damit sagen willst.

    Nicht deutlich genug. "Und?" ist eine andere Formulierung für "Was du sagst ist irrelevant.", nichts weiter.

    Das Beispiel sollte verdeutlichen dass es für mich ganz normal ist, dass zwei Wörter in vertauschter Reihenfolge was anderes bedeuten.

    Das ist in dem Beispiel aber nicht wirklich der Fall.



  • fuchsbau schrieb:

    @Gero_Programmierstil_de performance ist total unwichtig... darüber macht man sich erst gedanken, wenn das teil lahmt sonst wird man nie fertig!

    ich kenn mich damit relativ gut aus, daher der hinweis 😉

    Ja und manch andere behaupten das Gegenteil, so wie ich.



  • knivil schrieb:

    fuchsbau schrieb:

    @Gero_Programmierstil_de performance ist total unwichtig... darüber macht man sich erst gedanken, wenn das teil lahmt sonst wird man nie fertig!

    ich kenn mich damit relativ gut aus, daher der hinweis 😉

    Ja und manch andere behaupten das Gegenteil, so wie ich.

    du willst ein patt? ich würde wetten, dass Gero_Programmierstil_de noch nicht annähernd die erfahrung besitzt vorher abzuschätzen wo sich später evtl. engpässe ergeben könnten. daher soll er doch erst mal machen, profilen und _dann_ optimieren! ich denke das ist jetzt ein matt :p


Anmelden zum Antworten