Schnelles Arraykopieren?



  • Hi,

    ich benötige für meine Zwecke eine sehr gute Optimierung (RealTimeRayTracing) und möchte nun meine arrayfunktionen optimieren für andere Assemblersachen (wie z.B. SSE oder FPU)

    In 3DNow! mach ichs immer so:

    float Array1[2] = {100.0f, 200.0f};
    float Array2[2]; // Dieses Array soll gefüllt werden.
    
    _asm
    {
        femms;
        movq Array2, Array1; // Das erste Array ins Register laden
        femms;
    }
    

    Das geht auch ganz gut, neulich sagte mir ein Kumpel das es mit SSE2 schneller gehen würde, nun... stimmt das? Gibt es noch optimierungen an dieser funktion?



  • Schau ins Intel Architecture Optimization Reference Manual (kann man bei Intel saugen). Da steht so was drin, soweit ich mich erinnern kann.

    SSE2 braucht man wohl kaum, nur SSE. Kommt sehr auf dein spezielles Problem an, aber die PREFETCH und Non-Temporal-Befehl könnten sehr nützlich sein.



  • wat? sorry ich habe echt kaum was von dem verstanden was du sagtest, (bin leider ASM noob) 😞



  • Den ersten Satz wirst du ja wohl verstanden haben. Wenn du das gelesen hast, verstehst du auch den Rest. Wenn du ASM Noob bist, solltest du keine Low Level "Optimierungen" vornehmen, weil's dadurch meistens langsamer wird.



  • ok ich weis was mov und paar andere sachen sind, jedoch mit mov Array1, Array2 isses net getan. Drum frag ich ja wies in SSE aussieht. Könntest du da evtl. code posten zum auseinandernehmen? 😕



  • Wie ich jetzt schon mehrmals geschrieben habe, sollst du ins Intel Architecture Optimization Reference Manual schauen.

    http://developer.intel.com/design/pentium4/manuals/248966.htm

    Seite 6-44 z.B.



  • *** schrieb:

    float Array1[2] = {100.0f, 200.0f};
    float Array2[2]; // Dieses Array soll gefüllt werden.
    
    _asm
    {
        femms;
        movq Array2, Array1; // Das erste Array ins Register laden
        femms;
    }
    
    reinterpret_cast<double*>(Array2)[0]=reinterpret_cast<double*>(Array1)[0];
    

    wird schneller sein als dein 3dnow ansatz;)

    rapso->greets();



  • wie sieht das eigentlich beim kopieren grösserer arrays aus?



  • Da hängt's dann eh nur von der RAM-Bandbreite ab. Solange du aligned zugreifst, wird man wahrscheinlich keine großartigen Unterschiede zwischen den verschiedenen Methoden bemerken.


Anmelden zum Antworten