Optimiertes programmieren ... Assembler pflicht?
-
Hi..
ich bin Student und muss für meine BachelorArbeit einen Algorithmus schreiben für eine Bibliothek..es wird ein besonderes Augenmerk auf optimierung gelegt ..
daher spiele ich mit dem Gedanken mir ( neben C++ ) auch noch Assembler anzueignen.Lohnt sich das (allein dafür)?
oder ist der GCC so gut, dass er (kaum)/nicht mehr zu optimieren ist.
was meint ihr ?
mfg
tevlon
-
Es lohnt sich zumindest beim Debuggen, Assembler lesen zu können. Aber ich bezweifle stark, daß du deine Algorithmen in Assembler effizienter schreiben kannst als mit C++/GCC.
-
Es geht mir nicht darum den ganzen Code in Assembler zu schreiben.
Aber man kann sich ja den Code in Assembler ansehen ,wenn man sein Programm compliiert ?
Wenn man da den Code versteht .. kann man einen ( lohnenden ) grad an optimierung erreichen ?
-
ein neuer gcc ist sicher schon sehr stark optimiert. ich glaube nicht das es sich da noch lohnt inline assembler, etc. zu verwenden. zumal bei der leistung heutiger rechner eine optimierung mit assembler wahrscheinlich nur bei komplizierteren funktionen sinnvoll ist, und da muss man mehr als nur ein wenig know how rein stecken.
ander sieht es meiner meinung nach schon bei mikrocontroller programmierung aus. da kann assembler kenntnis sicher nicht schaden.
-
n00ki3 schrieb:
es wird ein besonderes Augenmerk auf optimierung gelegt ..
die optimierung eines algorithmus hat doch nichts mit der verwendeten programmiersprache zu tun. ein schlechter algorithmus in asm kann um den faktor 1000 langsamer sein als ein guter algorithmus in einer beliebigen hochsprache.
das wichtigste dürfte ja wohl die korrektheit des algorithmus sein. wenn du dann merkst, dass c++ zu langsam ist, kannst du dir immer noch überlegen wie du weiter optimierst.
-
the root of all evil schrieb:
n00ki3 schrieb:
es wird ein besonderes Augenmerk auf optimierung gelegt ..
die optimierung eines algorithmus hat doch nichts mit der verwendeten programmiersprache zu tun. ein schlechter algorithmus in asm kann um den faktor 1000 langsamer sein als ein guter algorithmus in einer beliebigen hochsprache.
das wichtigste dürfte ja wohl die korrektheit des algorithmus sein. wenn du dann merkst, dass c++ zu langsam ist, kannst du dir immer noch überlegen wie du weiter optimierst.genau, also vergiss den assembler quatsch
-
MMX-Instruktionen könnten aber Beschleunigungen bringen, wenn ich mich nicht irre. Aber da habe ich nie was mit gemacht.

-
Um C zu vestehen und diesen noch durch ASM zu optimieren, bedarf es langjähriger Erfahrung, sowas macht man mal nicht in 4 Wochen für die Abschlussphase des Studienganges.
-
Im Allgemeinen macht es keinen Sinn ASM für Optimierungen zu lernen.
Außnahmen bestätigen jedoch auch hier die Regel. So gibt es zum Beispiel eine Reihe von Grundoperationen welche einfach nicht direkt in C zugänglich sind. Auf x86 Prozessoren so zum Beispiel addc. (Ein einfaches add welches das Carry Flag nicht vor der Addition löscht.) Durch das Nutzen dieser Anweisung kann man effizienteren Code für die Addition von 2 big ints erzeugen als es ein C Compiler kann.
-
assembler bring wahrscheinlich wirklich nix, außer du entwickeslt für ein embedded system mit µC oder DSP.
Was am ehesten was bringt sind intrinsics, wenns wirklich so kritisch ist.
oder was es häufig gibt (hat mich aber noch nie bei den gängigen x86 (vcc, gcc) compilern interessert) sind compilerbefehle, bei denen du bei bedingten Sprüngen (if then else) angeben kannst, welcher Zweig der wahrscheinlichere ist. das mag eventuell was bringen.Aber wie gesagt: das größte Optimierungspotential ist meist eine Änderung des Algorithmus oder der zugrundeliegenden Datenstrukturen.
-
audacia schrieb:
Es lohnt sich zumindest beim Debuggen, Assembler lesen zu können.
Hm, für das Debugging von C++-Programmen kommt man normalerweise ganz gut ohne Assembler klar. Oder meintest du Optimierung?
Gerade wenn es um komplexe Algorithmen geht, kann ich mir vorstellen, dass eine Implementierung in Assembler relativ schwierig und fehleranfällig wäre, besonders wenn man die Sprache neu lernt. Kombiniert mit der Tatsache, dass es nicht mal sicher ist, ob man signifikant schnelleren Code schreibt (sodass sich der Aufwand lohnt), würde ich es vorerst lassen. Wenn man dann merkt, dass es mit C++ definitiv nicht geht, kann man sich Assembler immer noch überlegen.
-
Assembler lesen zu koennen ist immer praktisch. Nicht notwendig, aber praktisch. Assembler schreiben zu koennen ist eigentlich nur interessant und weder praktisch noch notwendig.
-
Nexus schrieb:
audacia schrieb:
Es lohnt sich zumindest beim Debuggen, Assembler lesen zu können.
Hm, für das Debugging von C++-Programmen kommt man normalerweise ganz gut ohne Assembler klar. Oder meintest du Optimierung?
Kommt drauf an, was man macht. Nicht immer habe ich den Quelltext des Codes, den ich debuggen will. Auch beim intensiven Umgang mit COM ist es zuweilen sehr praktisch. Auch wenn ein Programm beispielsweise im Startup-Code scheiterte, war mir das schon hilfreich.
-
Vor Urzeiten habe ich das mal im Ernst probiert, den gleichen Algorythmus in
Assembler und C programmiert (x86 unter DOS). C war knapp den 1.8 langsamer wie
Assembler.Es lohnt sich eigentlich eher nicht, der Aufwand ist wesentlich höher.
-
Ich denke auch dass grundlegende Assembler-Kenntnisse (soweit dass man Code lesen kann) ganz praktisch sind. Was noch gut ist ... wenn man weiss welche Dinge "teuer" sind und welche "billig".
Also z.B. dass das laden einer neuen Cachline teuer ist, dass Divisionen teuer sind, interlocked Befehle, bedingte Sprünge etc.
Und natürlich ganz grob in welcher Grössenordnung dieses "teuer" sich bewegt, und in welchen Fällen es voll zutrifft bzw. in welchen nur bedingt etc.z.B. sind bedingte Sprünge in einer engen Schleife, die aber in 99% der Fälle gleich ausgehen relativ billig, verglichen mit welchen die immer mal so mal so ausgehen. Solche Dinge.
Wenn man das mal weiss tut man sich relativ leicht abzuschätzen wo ein bestimmter C oder C++ Code zu etwas übersetzt werden wird was dann "bremst". Und natürlich abzuschätzen ob und ggf. was man machen kann um das schneller zu bekommen.
Genauso sollte man ein "grobes Gefühl" dafür entwickeln welche Funktionen in der C++ Standard-Library "teuer" sind und welche "billig".
Beispiel: wenn ich in einer Schleife irgendwo mit Strings (std::string) arbeite, dann kann ich die was Thema optimieren angeht oft schonmal abhaken. Oder wenn ich irgendeine File Funktion wo stehen habe muss ich mir garantiert keinen Kopf machen wenn da im gleichen Schleifendurchlauf noch 10 Divisionen mit dabeistehen.
Code wirklich in Assembler schreiben, dafür gibt's IMO nur sehr wenige Anwendungen. Und bei denen ist es meist "besser" einfach eine fertige optimierte Library zu verwenden (evtl. einzukaufen), wie z.B. die Intel Performance Primitives (oder wie auch immer die jetzt heissen).