Array = 0 setzen
-
Wie wär's mit einem 2. Array gleicher Größe. Das setzt man dann einmal Null. Bei Bedarf das 2. Array dem 1. Array zuweisen.
MfG
-
Das wäre sogar (ein bisschen) langsamer als die for-loop Methode oder die memset-Funktion.
-
flouser schrieb:
...das ist wohl war! Also : ARRAYGROESSE/4
Was wenn ARRAYGROESSE nicht durch 4 teilbar? Ausserdem wanderst du in der Schleife trotzdem nur um 1 Element weiter.
-
Diese seltsame forschleife ist sowieso absoluter blödsinn!
ob ich jetzt:mov cx, 100 ; arraysize zero_array: mov byte [es:di], 0 inc di loop zero_array
oder:
mov cx, 25 ; arraysize/4 zero_array: mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di mov byte [es:di], 0 inc di loop zero_array
schreibe, ändert nichts an der geschwindigkeit!
-
DennisB schrieb:
schreibe, ändert nichts an der geschwindigkeit!
Natürlich tut es das.
1. werden nur ein viertel der vergleiche durchgeführt und
2. werden nur ein viertel der jumps durchgeführt.Siehe einfach Duffs Device
Allerdings sollten gute Compile Loopunrolling beherrschen.
-
Ich hab den Assembler-Code zwar verstanden, finde aber trotzdem, dass er nicht ins C++-Forum gehört.
-
CarstenJ schrieb:
Vielleicht solltest du mal erklären, was du genau vorhast. Ich bin davon überzeugt, dass sich eine andere Lösung finden lässt.
Das Anwendungsgebiet ist ein Schachprogramm. Das Array wird für die Felderkontrolle gebraucht und wird in mehrern Funktionen während der Bewertungsfunktion aktualisiert und benötigt, muss aber natürlich vor jedem Aufrufen der Bewertungsfunktion wieder = 0 gesetzt werden.
Danke für die Hilfe aller Forumsteilnehmer.
MfG
modus
-
Dazu benötigst du aber a) kein Array und b) bestimmt kein globales.
-
for ( int i = 0; i < ARRAYGROESSE/4; i++ ) { array[i] = 0; array[++i] = 0; array[++i] = 0; array[++i] = 0; }
ist ebenfalls inkorrekt, man muss beachten, dass die modifizierten i-Werte auch im for-Schleifenkopf verändert sind.
Somit läuft das Teil in Viererschritten und somit müsste es auf diese Weise etwa 28 von 100 Teilen des Arrays = 0 setzen, was nicht den Erwartungen entspricht. (weil 100/4 = 25 aber das Teil nur in Viererschritten läuft)Ansonsten finde ich ebenfalls, dass das bestimmt falsch konzipiert ist, denn sowas ist eigentlich oft unsinnig.
MfG MAV
-
Mis2com schrieb:
Ansonsten finde ich ebenfalls, dass das bestimmt falsch konzipiert ist, denn sowas ist eigentlich oft unsinnig.
So eine Schleife ist immer unnötig, da wir std::memset, std::fill und std::fill_n haben.
Aber irgendwie scheint mich niemand ernstzunehmen
-
Aber irgendwie scheint mich niemand ernstzunehmen
Ja, der Thread ist ziemlich lustig. Irgendwie werden deine Posts immer übersprungen.
Also, für die, die es noch nicht gesehen haben: Shade Of Mine hat in diesem Thread auch etwas sehr sinnvolles geschreiben. Vielleicht einfach mal lsesen!
-
Natürlich ist es sinnvoll memset zu benutzen.
Aber nicht umsonst gibt es z.B. für den Intel Compiler Datentypen (builtin Typen) die genau dieses loop unrolling unterstützen.
Trotdem benutze auch ich memset - auch weil ich keinen Intel Compiler habe
Wie die sich auf die Zeit auswirken - keine Ahnung!
-
Du meinst SEE? Naja loopunroling kann man das nicht nennen. Das ist eben SIMD.
-
cd9000 schrieb:
Dazu benötigst du aber a) kein Array und b) bestimmt kein globales.
Meine Brettdarstellung ist ein Array, das Brett: 12x12. Ich benutze keine Bitboards für mein Programm.
Wie kann ich die Feldkontrolle, die z.B. der Turm aud d5,d6,d7 ausübt anders speichern, als in einem Array, das wenn ich einen Bauern auf d5 habe, sehe von welcher Seite das Feld kontolliert wird.
Und was wäre die andere Lösung, entgegen dem globalen Array, jene ich dann in verschiedenen Funktionen nutzen kann?
Nochmals Danke!
modus