speicher schreiben und der cache



  • re

    hab deinen C code mal getestet. der laeuft am BCB auch ca. 30 % langsamer als das memcpy.

    wie es aussieht, werde ich von dem memcpy wohl nicht wegkommen, was ziemlich stoerend ist, weil ich nun nur wegen dieser einen funktion die mem.h bzw string.h in meinen source includieren muss. naja kann man wohl nix machen.
    trotzdem dank dir.

    bis denn

    Meep Meep



  • Meep Meep schrieb:

    hab deinen C code mal getestet. der laeuft am BCB auch ca. 30 % langsamer als das memcpy.

    Vermutlich, weil du deinen Code im Debug-Modus kompiliert hast, und die memcpy-Funktion der Bibliothek natürlich im Release-Modus kompiliert wurde.

    camper schrieb:

    das einbinden von externem assembler sollte eigentlich kein problem sein - es sei denn bcb benutzt ein inkompatibles linker format?

    Für den BCB nimmt man halt den (mitgelieferten) Turbo Assembler, dann klappt das auch mit dem Dateiformat (der BCB kommt aber AFAIK auch mit MSVC-LIBs zurecht; kann allerdings sein, daß man sie konvertieren muß).

    camper schrieb:

    wenn der compiler auch nur ein bisschen was taugt, ist das in etwa nähmlich dass, was bei memcpy passiert.

    Um zu sehen, was eine solche Funktion macht, kann man sie einfach mit dem im Debugger integrierten Disassembler verfolgen.

    Beim BCB werden esi und edi beim Funktionsaufruf automatisch auf den Stack geschoben, da können wir also noch etwas sparen:

    void* my_memcpy (void* dest, const void* src, unsigned int len)
    {
            __asm
            {
                    mov     eax, dest
                    mov     edi, eax
                    mov     esi, src
                    mov     ecx, len
                    mov     edx, ecx
                    shr     ecx, 2
                    cld
                    rep movsd
                    mov     ecx, edx
                    and     ecx, 0x00000003
                    rep movsb
            };
    }
    

    Btw: bringt es eventuell was, die Adressen zunächst an DWORD-Grenzen auszurichten, und wenn ja, dann src oder dest?

    Moritz



  • hoi

    audacia schrieb:

    Meep Meep schrieb:

    hab deinen C code mal getestet. der laeuft am BCB auch ca. 30 % langsamer als das memcpy.

    Vermutlich, weil du deinen Code im Debug-Modus kompiliert hast, und die memcpy-Funktion der Bibliothek natürlich im Release-Modus kompiliert wurde.
    Moritz

    hab im release-modus kompiliert.

    Meep Meep



  • Meep Meep schrieb:

    hab im release-modus kompiliert.

    Ich auch, und bei mir liefen beide Funktionen etwa gleich schnell (BCB 6, X 1.5). Vielleicht Meßungenauigkeit?


  • Mod

    das cld dürftest du dir sparen können, es sei denn, bcb hat hier völlig andere konventionen. jedenfalls für vc++, gcc bei allen funktionseintritten und für alle API calls ist zwingend vorgeschrieben, dass das direction flag nicht gesetzt ist.



  • Meep Meep schrieb:

    das mit SSE waere interessant zu probieren, jedoch geht das mit dem bcb nicht.

    Ab welchen Prozessoren wird SSE eigentlich unterstützt?



  • re

    audacia schrieb:

    Meep Meep schrieb:

    das mit SSE waere interessant zu probieren, jedoch geht das mit dem bcb nicht.

    Ab welchen Prozessoren wird SSE eigentlich unterstützt?

    bin mir nicht ganz sicher. beim intel ab dem Pentium III und beim AMD ab dem AMD64. wobei ich mir da bei dem Septeron oder wie der heisst nicht ganz sicher bin. AMD XP koennen SSE nur zum teil anwenden.

    Meep Meep


  • Mod

    Meep Meep schrieb:

    AMD XP koennen SSE nur zum teil anwenden.

    wieso zum teil?
    obige kopierroutine ist übrigens verbugt - immer dann, wenn die blockgrösse ein vielfaches von 4 ist, hast du ein problem 🙂



  • camper schrieb:

    Meep Meep schrieb:

    AMD XP koennen SSE nur zum teil anwenden.

    wieso zum teil?

    Zitat:
    AMD unterstützt erst mit seinen aktuellsten Prozessoren SSE vollständig. Davor wurden nur die Befehle unterstützt, die mit 64-Bit-Registern arbeiten.

    http://www.computerbase.de/lexikon/SSE <- da hatte ich das mal gelesen.

    Meep Meep



  • camper schrieb:

    obige kopierroutine ist übrigens verbugt - immer dann, wenn die blockgrösse ein vielfaches von 4 ist, hast du ein problem 🙂

    Meine? Wo?




  • Mod

    wenn wir schon beim link geben sind:
    http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25112.PDF
    enthält im abschnitt 5.12 ebenfalls eine ganze reihe kopierroutinen und diskutiert deren vor- und nachteile

    audacia schrieb:

    camper schrieb:

    obige kopierroutine ist übrigens verbugt - immer dann, wenn die blockgrösse ein vielfaches von 4 ist, hast du ein problem 🙂

    Meine? Wo?

    jetzt wo du fragst, bin ich mir auch nicht mehr sicher; aber war es nicht so, dass bei ecx == 0 der befehl 2^32 mal ausgeführt wird ? das ist bei mir seit dem Z80 (LDIR) so drin.


Anmelden zum Antworten