Beschleunigung der Array-Suche nach dem Traversieren?

8

Ich habe ein 123MB großes int -Array und es wird grundsätzlich so verwendet:

%Vor%

eval() heißt viel (~ 50B mal) mit verschiedenen c und ich würde gerne wissen, ob (und wie) ich es beschleunigen könnte.

Ich verwende bereits eine unsichere Funktion mit einem festen Array , die alle CPUs nutzt. Es ist ein C # -Port des TwoPlusTwo 7-Karten-Evaluators von RayW . Die C ++ - Version ist unwesentlich schneller.

Kann die GPU verwendet werden, um dies zu beschleunigen?

    
Sven 27.12.2012, 12:16
quelle

1 Antwort

2
  1. Cache die Array-Referenz in eine lokale Variable. Statische Feldzugriffe sind aus mehreren Gründen im Allgemeinen langsamer als lokale (einer davon ist, dass sich das Feld ändern kann, so dass es ständig neu geladen werden muss. Das JIT kann Einheimische viel freier optimieren).
  2. Verwenden Sie kein Array als Argument für die Methode. Hard-Code 7 Ganzzahl-Indizes. Das reduziert Array-Zuweisung, Indirection-Penalty und Grenzen-Überprüfung.
  3. Verwenden Sie unsicheren Code zum Indizieren in das Array. Dies wird die Überprüfung der Grenzen eliminieren. Verwenden Sie GCHandle , um das Array zu fixieren und den Zeiger in einem statischen Feld zwischenzuspeichern (verwenden Sie nicht nur einen festen Block - ich glaube, es hat einen gewissen (geringen) Aufwand für die Eingabe. Nicht sicher).
  4. Alternativ zum Fixieren des Arrays, ordnen Sie das 123-MB-Array mit VirtualAlloc zu und verwenden Sie große Seiten. Das verringert TLB-Fehler.

All dies sind hardcore Low-Level-Optimierungen. Sie gelten nur, wenn Sie maximale Leistung benötigen.

Ich denke, wir sind hier ziemlich am Limit, wenn es darum geht, diese Funktion zu optimieren. Wir können es wahrscheinlich nur besser machen, wenn Sie dem Aufrufer der Funktion zeigen, dass sie als eine Einheit optimiert werden können.

    
usr 27.12.2012, 14:22
quelle

Tags und Links