Wie schreibe ich schnellen (Low-Level-) Code? [closed]

Lesezeit: 5 Minuten

Benutzer-Avatar
Szabolcs

Ich möchte mehr über die Low-Level-Code-Optimierung und die Nutzung der zugrunde liegenden Maschinenarchitektur erfahren. Ich suche nach guten Hinweisen, wo ich über dieses Thema lesen kann.

Mehr Details:

Ich interessiere mich für Optimierung im Kontext des wissenschaftlichen Rechnens (was aber viel Rechenarbeit ist nicht nur) in Low-Level-Sprachen wie C/C++. Ich interessiere mich besonders für Optimierungsmethoden, die nicht offensichtlich sind, es sei denn, man hat ein gutes Verständnis dafür, wie die Maschine funktioniert (was ich noch nicht weiß).

Zum Beispiel ist klar, dass ein besserer Algorithmus schneller ist, ohne etwas über die Maschine zu wissen, auf der er läuft. Es ist überhaupt nicht offensichtlich, dass es darauf ankommt, ob man zuerst die Spalten oder die Zeilen einer Matrix durchläuft. (Es ist besser, die Matrix zu durchlaufen, damit Elemente, die an benachbarten Stellen gespeichert sind, nacheinander gelesen werden.)

Grundsätzliche Hinweise zum Thema oder Hinweise auf Artikel sind herzlich willkommen.

Antworten

Ich habe Antworten mit vielen großartigen Hinweisen erhalten, viel mehr, als ich jemals Zeit zum Lesen haben werde. Hier ist eine Liste mit allen:

Ich brauche ein wenig Zeit zum Überfliegen, um zu entscheiden, welches ich verwenden soll (ich habe keine Zeit für alle).

  • Danke für alle Antworten. Obwohl ich nur eine Antwort akzeptieren kann, waren alle sehr hilfreich. Leider konnte ich das Intel-Buch nicht bekommen, von dem ich vermute, dass es für mich nützlicher sein könnte als die akzeptierte Antwort

    – Szabolcs

    8. August 2011 um 12:42 Uhr

Dreppers Was jeder Programmierer über Speicher wissen sollte [pdf] ist ein guter Hinweis auf einen Aspekt der Low-Level-Optimierung.

  • +1, Aus einem schnellen Überblick: Auf 114 Seiten ist es sehr detailliert und technisch, geht so weit, über die physische Implementierung verschiedener Speichertypen zu sprechen, enthält aber auch viele Informationen, die für meine Frage relevant sind, insbesondere zur Verwendung des CPU-Cache. Es gibt viele Informationen zur Optimierung und zum korrekten Benchmarking.

    – Szabolcs

    28. Juli 2011 um 0:46 Uhr

  • Das Kapitel über Caches ist wirklich ein Muss für jeden Programmierer, der seine Kunden nicht hasst.

    – Absturz

    29. Juli 2011 um 5:10 Uhr

Für Intel-Architekturen ist dies unbezahlbar: Das Kochbuch zur Softwareoptimierung, zweite Auflage

  • Aus der Beschreibung geht hervor, dass es genau das ist, was ich suche 🙂

    – Szabolcs

    28. Juli 2011 um 0:08 Uhr

  • Kennen Sie ein ähnliches Buch, aber für Armarchitektur?

    – Vinicius Kamakura

    28. Juli 2011 um 0:14 Uhr

  • @hexa: leider kenne ich keine. Eine schnelle Suche zeigt Dinge wie amazon.com/ARM-System-Developers-Guide-Architecture/dp/… aber ich habe diese nie geöffnet. Für die in meinem Link kann ich zu 100% bürgen, ist ausgezeichnete Qualität und vollgepackt mit Tipps und Tricks.

    – Remus Rusanu

    28. Juli 2011 um 0:23 Uhr

Es ist schon ein paar Jahre her, dass ich es gelesen habe, aber Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level von Randall Hyde war ziemlich gut. Es gibt gute Beispiele dafür, wie C/C++-Code in Assembler übersetzt wird, z. B. was wirklich passiert, wenn Sie einen großen haben switch Aussage.

Ebenfalls, altdevblogaday.com konzentriert sich auf die Spieleentwicklung, aber die Programmierartikel könnten Ihnen einige Ideen geben.

Benutzer-Avatar
Murrekatt

Hacker’s Delight ist ein interessantes Buch über Bit-Manipulation und clevere Wege, Dinge auf niedriger Ebene zu erledigen.

Dies ist definitiv eine Lektüre wert für alle, die sich für Low-Level-Codierung interessieren.

Kasse: http://www.agner.org/optimize/

Benutzer-Avatar
Jesus Ramus

C und C ++ sind normalerweise die Sprachen, die aufgrund ihrer Geschwindigkeit dafür verwendet werden (fortran ignorieren, da Sie es nicht erwähnt haben). Was Sie nutzen können (was der ICC-Compiler häufig tut), sind SSE-Befehlssätze für eine Menge Verarbeitung von Gleitkommazahlen. Eine andere Sache, die möglich ist, ist die Verwendung von CUDA- und Stream-APIs für Nvidia/Ati, um SEHR schnelle Gleitkommaoperationen auf der Grafikkarte auszuführen, während die CPU für den Rest der Arbeit frei bleibt.

Benutzer-Avatar
Toni Delroy

Ein weiterer Ansatz hierfür ist der praktische Vergleich. Sie können sich eine Bibliothek wie Blitz++ (http://www.oonumerics.org/blitz/) besorgen, die – wie mir gesagt wurde – aggressive Optimierungen für numerisches/wissenschaftliches Rechnen implementiert, und dann einige einfache Programme schreiben, die für Sie interessante Operationen ausführen ( zB Matrixmultiplikationen). Wenn Sie Blitz++ verwenden, um sie auszuführen, schreiben Sie Ihre eigene Klasse, die dasselbe tut, und wenn sich Blitz++ als schneller erweist, beginnen Sie mit der Untersuchung seiner Implementierung, bis Sie erkennen, warum. (Wenn Ihres deutlich schneller ist, können Sie es den Blitz++-Entwicklern mitteilen!)

Am Ende solltest du viele Dinge lernen, zum Beispiel:

  • Speicher-Cache-Zugriffsmuster
  • Ausdrucksvorlagen (es gibt einige schlechte Links auf den Google-Suchergebnissen zu Ausdrucksvorlagen – das Schlüsselszenario/die Schlüsseleigenschaft, über die Sie eine Diskussion finden möchten, ist, dass sie viele aufeinanderfolgende Schritte in einer Kette von Vorgängen codieren können, sodass sie alle während einer Schleife angewendet werden ein Datensatz)
  • einige CPU-spezifische Anweisungen (obwohl ich nicht überprüft habe, ob sie solche nicht tragbaren Techniken verwendet haben) …

1377120cookie-checkWie schreibe ich schnellen (Low-Level-) Code? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy