Multiplikation oder if Abfrage (Effizienz)



  • Hi !

    Was ist effizienter?
    In einer if-Abfrage 2 Vergleiche von 2 double Elementen, oder eine Multiplikation von 2 doble Elementen?

    Es geht um die Multiplikation 2-er Matrizen. Die Matrizen sind sehr gross und beinhalten viele Nullen. Nun weiss ich nicht, ob die Multiplikation schneller ist, wenn ich, bevor ich die einzelnen Elemente Multipliziere, eine if-Abfrage einbauen sollte, die nachschaut, ob möglicherweise zwei Nullen miteinander multipliziert werden würden.



  • ich hoffe, der prozessorbauer hat genau dieses if in den plutimikatonsbefehl eingebaut.
    miss mit rdtsc selber nach.

    //GCC
    inline u64 rdtsc(){
    	u64 r;
    	asm volatile(
    		"rdtsc"
    		:"=A" (r)
    	);
    	return r;
    }
    
    //MSVC
    #pragma warning(push)
    #pragma warning(disable:4035)//Kein Rueckgabewert
    inline u64 rdtsc()
    {
    	_asm rdtsc
    }
    #pragma warning(pop)
    
    //BCB
    inline u64 rdtsc()
    {
    	_asm rdtsc
    }
    


  • Hmm, diesen Code verstehe ich nicht 😞
    Wo wird denn da die Zeti für Multiplikation und die if Abfrage gemessen?



  • rtdsc misst auf x86er Plattformen die vom Prozessor verbrauchten Taktzyklen.

    Aber bist du dir sicher, dass du dich auf die Ebene der Optimierung herablassen musst? Optimiere nur da wo es sinnvoll ist und wo es sinnvoll ist sagt die ein Profiler.

    Bedenke auch, dass so eine if Abfrage schnell den Compiler verwirrt oder die Code Erzeugung verkompliziert. In einem Moment hätte dein Compiler dir vielleicht tollen SIMD Code geliefert, aber durch die if Abfrage ist es auf einmal nicht mehr möglich.

    Mein Tipp: Solche Microoptimierung nur nach Überprüfung mit einem Profiler durchführen und die genauen Auswirkungen beobachten!



  • Garnicht. Volkard hat Dir nur eine Funktion gegeben, die Zeit messen kann (und sehr genau). Mach einfach vor dem fraglichen Codestück ein rdtsc und danach auch. Die Differenz der beiden Werte ist die Anzahl der Prozessortakte, die dazwischen benötigt wurden. Damit kannst Du leicht feststellen, welcher Code schneller ist.



  • Mit Matrizen welcher Größenordnung hast du es denn zu tun, wieviele Elemente sind in etwa besetzt und welches Format hat deine Matrixstruktur? Eventuell gibt es offensichtlichere Optimierungen die man ausnutzen kann.



  • kingruedi schrieb:

    Mein Tipp: Solche Microoptimierung nur nach Überprüfung mit einem Profiler durchführen und die genauen Auswirkungen beobachten!

    darf er statt des profilers auch rdtsc nehmen?



  • wenn geschwindigkeit ein problem ist, würde ich hier über traditionellere methoden nachdenken: verringern der genauigkeit und vektorisierung. ein test auf 0 ist eine krücke, die leicht nachhinten losgehen könnte, vorausgesetzt, es bringt überhaupt erstmal einen nennenswerten geschwindigkeitsgewinn.



  • volkard schrieb:

    kingruedi schrieb:

    Mein Tipp: Solche Microoptimierung nur nach Überprüfung mit einem Profiler durchführen und die genauen Auswirkungen beobachten!

    darf er statt des profilers auch rdtsc nehmen?

    rdtsc ist vor allem wichtig um die Auswirkungen der Optimierung zu erfahren. Man kann es natürlich auch als Profiler einsetzen. Es ist einfach nur wichtig, dass man weiß wo man optimieren muss und keine Zeit mit Kleinigkeiten verschwendet. Wir kennen ja alle die 80/20-Regel 🙂



  • Walli schrieb:

    Mit Matrizen welcher Größenordnung hast du es denn zu tun, wieviele Elemente sind in etwa besetzt und welches Format hat deine Matrixstruktur? Eventuell gibt es offensichtlichere Optimierungen die man ausnutzen kann.

    Die Matrizengrößen sind in etwa 10.000 x 10.000 und noch grösser.
    Die MAtrizen sind dünnbesetzt.
    Doch ich soll die bestmögliche Variante ohne Ausnutzung der Sparse Darstellung mit der bestmöglichen Variante für Sparse Darstellung vergleichen.
    Ich suche nur nach einer bestmöglichen Optimierung für den anderen Fall, dass ich einfach drauf los multiplizieren würde (auch wenn ich da in der Multiplikation mit der if-Abfrage das ausnutzen würde, dass sie dünnbesetzt ist, aber es geht in dem Vergleich um die gewählten Datenstrukturen).
    Ich werde es dann mal ohne der if-Abfrage machen.
    Ich dachte, dass da ein grössere Laufzeitverbesserung zu erwarten wäre, wenn ich die if-Abfrage vorher mache.



  • bucada schrieb:

    Ich suche nur nach einer bestmöglichen Optimierung für den anderen Fall, dass ich einfach drauf los multiplizieren würde (auch wenn ich da in der Multiplikation mit der if-Abfrage das ausnutzen würde, dass sie dünnbesetzt ist, aber es geht in dem Vergleich um die gewählten Datenstrukturen).

    Ok, dann musst du halt versuchen in dem Code das letzte Quentchen rauszuholen. Ich würde mir aber keine großen Hoffnungen machen, dass du da viel erreichst.


Anmelden zum Antworten