Array zurücksetzen (Performance optimiert)



  • Da gibts ein Sprachmittel, dass dir diese Fragen erspart -> sizeof(bool) 😉

    MfG SideWinder



  • memset( CLayer, 0, 1920000 );

    nicht vergessen das 0 hier nicht die dezimale 0 ist, eigentlich ist diese 0 bei memset irgendwas (alle bits auf 0) ob das nun irgendeiner Zahlendarstellung entspricht ist dann nicht mehr vom Standard gedeckt.

    bye

    tt



  • N-Dream schrieb:

    Wenn ich jedes mal wieder muss auf jedes Element zugreifen muss dauert das viel zu lange. Ich möchte mit einem Clocktick alle setzen.

    LOL. Dir ist aber schon klar, dass deine Prozessor Pipeline eine begrenzte Datenbreite hat?

    Die schnellste portabelste Lösung ist sicherlich memset, da viele Compiler die Funktion als Intrinsic integriert haben. Richtig gute Compiler können allerdings solch einfache Schleifen genauso effizient wie memset umsetzen. Kannst ja aber auch mal SideWinder's Vorschlag umsetzen, und zB SSE benutzen. Damit kannst du 128 Bit (also 16 Byte) in einem CPU Cycle lesen bzw. schreiben. Durch die Intel Spezifikationen ist das ganze auch relativ portabel, zumindest bei Compilern, die diese Spracherweiterungen unterstützen, wie GCC oder MSC.



  • ...und imho ist SSE auch auf 3DNow-fähigen Compilern ausführbar. Also auch auf AMD-Prozessoren.

    BTW: Mit Debug-& Releasemodus würde ich auch penlihc genau aufpassen. memset() ist in beiden Fallen in reinem hochoptimierendem Assembler geschrieben.

    Im Debug-Modus kann er aber deinen Code gar nicht optimieren.

    MfG SideWinder



  • SideWinder schrieb:

    ...und imho ist SSE auch auf 3DNow-fähigen Compilern ausführbar. Also auch auf AMD-Prozessoren.

    Da musst du aufpassen. SSE ist meines Wissens bei AMD erst ab dem Athlon XP verfügbar. Mein alter Thunderbird 900 MHz (ich glaub es war die B Version) konnte SSE zB nicht, und als museumsreif kann man die CPU noch nicht bezeichnen.



  • Okay dann ein Prüfung für die Library ob Unterstützng da ist, wie in Zerbsts Buch.

    Die Frage nur ob sich der Aufwand für ein 800*600-Feld lonht. Okay letzten Endes lohnt es sich sicherlich, da diese Prüfung nur einmal am Programmstart durchgeführt werden muss. Aber trotzdem. Soviel Arbeit um ein 800*600-Feld auf 0 zu setzen?

    Dann lieber die doppelte for-Schleife und im Release-Modus richtig optimieren lassen über Projekteinstellungen bzw. gleich memset().

    MfG SideWinder



  • N-Dream schrieb:

    @TomasRiker: Natürlich sind die array 801x601...

    In Deinem Code steht allerdings [800][600], und das sind dann auch 800x600, und nicht 801x601 😉 ich denke mal, Du willst damit irgendwas Grafisches machen, dann brauchst Du ja die zusätzliche Pixel-Spalte und Zeile nicht.



  • die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden,

    ich habe mal mit msvs6.0 eine string klasse geschreiben, die alle möglichen operationen mit 4 bytes gleichzeitig macht (war 4 mal schneller als mit einfachen fors, das hat was mit 1 char i.d.r. 1 byte und 32 bit cpus zu tun) aber schneller als die mem* funktion war es immer noch nicht
    dieses wissen kann dir trozdem nutzen, wenn es keine passende mem* funktion gibt versuche 4 bytes auf einmal zu bearbeiten (dirty cast zu int* helfen bei)
    aber an deiner stelle würde ich das programm erstmal zu laufen bringen, das wird schon schwer genug sein auch ohne bugs die durch falsche benutzen von den mem* funktion herruhren



  • Gerard schrieb:

    die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden

    Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.

    Ich sehe die produktivität deines beitrags noch nicht ganz:
    "Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
    Find ich stark.

    Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
    https://n.ethz.ch/student/vandrin/download/Beasts.exe
    Bakterien simulation.



  • N-Dream schrieb:

    Gerard schrieb:

    die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden

    Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.

    Ich sehe die produktivität deines beitrags noch nicht ganz:
    "Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
    Find ich stark.

    Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
    https://n.ethz.ch/student/vandrin/download/Beasts.exe
    Bakterien simulation.

    Du hast doch sogar extra geschrieben, dass du 801x601 meinst und absichtlich <= benutzt hast und nicht < und jetzt auf einmal nicht mehr 😕



  • ich habe es nicht so gemeint wie du es verstanden hast.



  • sind arrays nicht an einem stück im speicher? => schreib doch das ganze stück einfach platt, memset lässt grüßen



  • ps. access violation at address 00407393 in module 'Beasts.scr'. Read of address 00000028 😉 🕶 😃



  • N-Dream schrieb:

    Gerard schrieb:

    die mem* funktionen sind wirklich schnell, aber sie werden dir viel trauer veruhrsachen wenn du noch probleme hast dich zwischen <= und < zu entscheiden

    Mein lieber ich glaub ich weiss von was ich rede, und nur weil ich mich einmal um eine zahl in einem Array vertippe (was für diese frage sowieso irrelevant ist), heisst das nicht, dass ich nicht programmieren kann.

    Ich sehe die produktivität deines beitrags noch nicht ganz:
    "Hey leute ich bin mega krass und habe meine eigene memset-funktion geschrieben, aber sie ist langsamer und du N-Dream bist scheisse weil du dich irrelevant vertippst."
    Find ich stark.

    Danke aber trozdem an alle, die mir geholfen haben! Es ist mitlerweile viel schneller. Wen es interessiert um was es geht:
    https://n.ethz.ch/student/vandrin/download/Beasts.exe
    Bakterien simulation.

    Also ich glaub auch nicht, das du programmieren kannst. Und Compilate werde ich mir von dir nicht runterladen. Dazu bist du nicht vertrauenswürdig genug.



  • @ Gerard: Sorry das ich Dir aso an den Wagen gefahren bin, aber ich hab mich einfach aufgeregt. Tut mir leid 🙂

    Access Violation sollte gefixt sein.



  • Also, was solln das jetzt genau darstellen und für was die vielen Knöpfe?
    Könntestn ja eventl. noch ne Readme zur Exe-Packen.
    Ansonsten kann ich ja nur sagen schön bunt. 😃



  • //kurz zusammengehackt
    double* pArray1 = (double*)&(CLayer[0][0]);
    double* pArray2 = (double*)&(CLayer[0][0]);
    for(int a=0;a<=(800*600)>>1;a+=4)
    {
           pArray1[a]=pArray2[a]=0;
           pArray1[a+1]=pArray2[a+1]=0;
           pArray1[a+2]=pArray2[a+2]=0;
           pArray1[a+3]=pArray2[a+3]=0;
    }
    

    laut AMD sollte das das schnellste sein, wobei das unrollen vom compiler gemacht werden sollte 😉

    rapso->greets();



  • da kannst auch gleich das hier "(800*600)>>1" als Zahlenwert angeben

    bye

    tt



  • @rapso:

    rapso schrieb:

    //kurz zusammengehackt
    double* pArray1 = (double*)&(CLayer[0][0]);
    double* pArray2 = (double*)&(CLayer[0][0]);
    for(int a=0;a<=(800*600)>>1;a+=4)
    {
           pArray1[a]=pArray2[a]=0;
           pArray1[a+1]=pArray2[a+1]=0;
           pArray1[a+2]=pArray2[a+2]=0;
           pArray1[a+3]=pArray2[a+3]=0;
    }
    

    Sollte pArray2 nicht TLayer heissen anstatt CLayer?



  • rofl.

    was für eine Frage.


Anmelden zum Antworten