![]() |
16 Byte Alignment? (SSE)
NAbend,
Mich würde mal interressieren, ob es möglich ist irgendwie 16byte alignment in Delphi zu nutzen. Soweit ich das sehen konnte funktioniert effektiv nur 8byte alignment v.v. SSE hätte aber gerne 16byte alignment. JA, ich kann auch mit unaligned memory arbeiten, aber das ist nen quäntchen langsamer. Testrecord:
Delphi-Quellcode:
ps: wenn überhaupt, ab welchem compiler wirds unterstützt?
Type
TTest = record X, Y, Z, W: Single; end; MFG Memnarch |
AW: 16 Byte Alignment? (SSE)
|
AW: 16 Byte Alignment? (SSE)
Zitat:
|
AW: 16 Byte Alignment? (SSE)
Zitat:
|
AW: 16 Byte Alignment? (SSE)
Zitat:
a) die Speicheradressen der Record-Felder X, Y, Z und W sollen jeweils auf einer 16-Bit-Grenze liegen b) der gesamte Record soll auf einer 16-Bit-Grenze liegen Leider geht a) nur, wenn du entsprechende Füller einbaust. Für b) gibt es aber ein Keyword, daß ein (nicht-gepacktes) Record auf eine 16-Bit-Grenze setzt:
Delphi-Quellcode:
Ab wann das geht, kann ich im Moment nicht sagen; getestet habe ich es unter XE2.
type
TTest = record X: Single; Y: Single; Z: Single; W: Single; end align 16; |
AW: 16 Byte Alignment? (SSE)
Zitat:
Also 128-Bit Alignment. |
AW: 16 Byte Alignment? (SSE)
Zitat:
|
AW: 16 Byte Alignment? (SSE)
ah danke :)
align als record zusatz scheint wohl auch unter XE zu funktionieren(D7 noch nicht). @Uwe sofern ich das richtig verstanden habe, sollte der Record auf einer 16Byte grenze liegen, um bei den SSE befehlen z.B. movaps nutzen zu können anstatt movups(a für aligned und u für unaligned). Bei dem versuch aligned zu nutzen klatschts aber gerade noch gewaltig^^. "AV read of address FFFFFFFF" so schauts gerade aus:
Delphi-Quellcode:
das ganze ist in einer funktion geschrieben, die die beiden vectoren übergeben bekommt.(vom typ TTest).
movaps XMM0, [VecA];
movaps XMM1, [VecB]; addps XMM0, XMM1; movups [Result], XMM0; VecA u. VecB sind als const parameter deklariert. Irgendwas läuft schief o.O |
AW: 16 Byte Alignment? (SSE)
Zitat:
Ich muss auch gestehen, daß mein Wissen hierbei auch nur theoretischer Natur ist. |
AW: 16 Byte Alignment? (SSE)
Habe keinen packed record ABER es könnte sein dass da was mit dem stack passiert. Es gibt auch noch die Directive {$CodeAlign X} ( x = 1, 2, 4, 8, 16). Diese sorgt wohl dafür das auch funktionen etc auf diese grenzen ausgerichtet werden. Knallt aber immernoch fröhlich >.<
edit: AH global deklarierte records werden sauber aligned. Nur die lokalen und die parameter nicht o.O. Hab mir mal die adressen ausgeben lassen. (Mit den globalen klappts auch) |
AW: 16 Byte Alignment? (SSE)
Das ALIGN hat dann allerdings nur auf direkte Variablen (lokal, global oder als Feld) eine wirkung, aber indirekt ist das auch schon bei Pointern (GetMem und Co.) gegeben, denn FastMM richtet jeden Speicher schon seit Jahren so aus und nutzt selber SSE-Moves, oder warn's MMX?.
|
AW: 16 Byte Alignment? (SSE)
@Himi: Klär mich auf, bei mir sind nur die globalen aligned, die lokalen NICHT(wahrscheinlich weil die funktionen erst gar nicht aligned werden v.v).
PS: kan mir mal jemdan den unterschied zwischen:
Delphi-Quellcode:
und
function name():TTest
asm movups [result], xmm0; end;
Delphi-Quellcode:
erklären? Bei letzterem würde ich nämlich nen Operandsize missmatch error bekommen o.O
function name():TTest
begin asm movups [result], xmm0; end; end; |
AW: 16 Byte Alignment? (SSE)
Ich denke, dass bei deiner ersten Version kein Stack-Rahmen angelegt wird, bei der zweiten, mit "begin ... end" umschlossenen sehr wohl.
|
AW: 16 Byte Alignment? (SSE)
Davon abgesehen funktioniert die 2. Methode ab XE2 nicht mehr.
|
AW: 16 Byte Alignment? (SSE)
@NeutralGeneral: Da gehts dan nur mit kompletten ASM funktionen oder gar nicht, richtig?(wegen inline asm)
|
AW: 16 Byte Alignment? (SSE)
Zitat:
|
AW: 16 Byte Alignment? (SSE)
Delphi alignmentiert :lol: standardmäßig nur soweit, wie es jeweils der größte Type verlangt.
Deine Double sind nur 8 Byte, also werden sie auch an 8 Byte-Grenzen ausgerichtet. Bytes werden an Byte-Grenzen ausgerichtet, wie z.B. ein
Delphi-Quellcode:
oder ein Record mit 8 Byte, da der größe Eineltyp ja ein Byte ist.
array[0..7] of Byte
|
AW: 16 Byte Alignment? (SSE)
Zitat:
Zitat:
> die ganze Funktion in Assembler oder garnichts (die haben es sich halt leicht gemacht und diesen MixedMode garnicht erst implementiert) |
AW: 16 Byte Alignment? (SSE)
@Himitsu: Hab mir jetzt unter D7 eine art MemoryManager geschrieben.
Die klasse implimentiert unter anderem die methoden MemGet/MemFree. MemGet hat neben der angefragten größe noch einen parameter Alignment. Mein Manager spuckt dann auch nur ne adresse aus, die an dem Parameter Alignment ausgerichtet ist :D |
AW: 16 Byte Alignment? (SSE)
Du könntest natürlich auch einfach FastMM einbinden. (der ist eh besser, als der alte DelphiMM)
|
AW: 16 Byte Alignment? (SSE)
Mag sein dass der besser ist, aber ich hab ihn hier gerade nicht zur hand :P.
Und einfach alles querbet in mein Delphi hier zu installieren wäre etwas unpraktisch^^. Probier ich mal @Home aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz