Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Memory Alignment


TRomano - Mi 10.09.03 10:12
Titel: Memory Alignment
Unter Delphi7 habe ich das Problem, das keine explizite Angabe der Datenausrichtung möglich ist (wie z.b. in C++ mit Align(16) oder MASM mit ALIGN 16). Dadurch entfallen beim Inline-Assembler leider SSE2-Befehle wie MOVDQA, die an der 16Byte-Grenze ausgerichtet sind.
Das bedeutet aber gerade beim Moven von daten erhebliche geschwindigkeitsverluste. Gibt es eine Möglichkeit die Daten trotzdem an 16 Byte auszurichten ?
Danke.


AndyB - Mi 10.09.03 10:25

Du könntest den Speicher mit VirtualAlloc reservieren. Dieser ist auf 4KB ausgerichtet (was durch 16 Teilbar ist).


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function VAllocMem(Size: Integer): Pointer;
begin
  Result := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
end;

procecedure VFreeMem(var P);
begin
  VirtualFree(Pointer(P), 0, MEM_FREE);
end;


maximus - Mi 10.09.03 15:01

Also ich weiss, dass man mit der direktive {$A} das alignment von records und klassen-feldern ändern kann! Ob man das aber auch mit 16 byte machen kann und ob dir das hilft, weiss ich nicht?

viel glück


AndyB - Mi 10.09.03 23:59

{$ALIGN x} geht nur mit 1, 2, 4 und 8. Die 16 wird noch nicht unterstützt.


TRomano - Mo 15.09.03 13:20

Die Allokierung von Speicher erfolgt bei meinem Projekt (Arrays) automatisch, da ich in der Hauptsache mit dynamischen Arrays arbeite. Daher sind die Daten mal auf 4,8 oder 16 Byte ausgerichtet. nach langen Probieren und Studieren (System.pas) bin ich zu dem Schluss gekommen, dass Delphi7 mir hier nicht weiter hilft. Trotzdem herzlichen Dank !!!