schneller als memcpy() unter linux mit inline-asm



  • hallo!

    folgendes: hab ein Uint16-Array, das in ein anderes kopiert wird, dafür verwende ich bisher

    for (int sample = 0; sample < samples; ++sample)
         dest_sample[sample] = source_sample[sample];
    

    soweit so gut, mit memcpy() geht das sicher schneller, geht das aber mit inline-asm mit dem GCC noch schneller?? wenn ja, wie? unter DOS würde ich einfach mit REP MOVSD anfangen, aber unter linux dürfte das doch mit den seg-regs anders sein, oder??



  • Hi.

    Je nach CPU gibt es da hoechst eigenartige Moeglichkeiten, Daten moeglichst schnell im Speicher herumzuschieben.
    rep movsd ist da - vor allem falsch angewendet, dh. wenn die Adressen nicht dword aligned sind - bei weitem nicht das Schnellste.
    IMHO wird der gcc das schon recht gut optimieren, wenn du zB. memcpy benutzen wuerdest.
    Wenn du aber trotzdem noch selbst basteln willst, wirf vielleicht mal einen Blick hier rein...



  • Grundsätzlich sollte man von Inline Assembler sowieso absehen. Damit zerstörst du die Portabilität des Programms auf andere Maschinentypen (Alpha, Sparc, etc)

    -junix



  • dazu gibts ja #ifdefs, also z.b.

    #ifdef USE_MMX
    asm ...
    #else
    alter-c-code...
    #endif

    und damit hat sich das 🙂


Anmelden zum Antworten