Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 16 Byte Alignment? (SSE) (https://www.delphipraxis.net/165047-16-byte-alignment-sse.html)

Memnarch 12. Dez 2011 16:19

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:
Type
  TTest = record
    X, Y, Z, W: Single;
  end;
ps: wenn überhaupt, ab welchem compiler wirds unterstützt?

MFG
Memnarch

jfheins 12. Dez 2011 16:24

AW: 16 Byte Alignment? (SSE)
 
Siehe hier: http://docwiki.embarcadero.com/RADSt...chten_(Delphi)

Uwe Raabe 12. Dez 2011 16:30

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von jfheins (Beitrag 1141007)

Dem Link fehlt die schließende Klammer!

jfheins 12. Dez 2011 16:39

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1141009)
Dem Link fehlt die schließende Klammer!

Ich schiebe das mal auf den DP URL Parser, hab's aber trotzdem korrigiert ;-)

Uwe Raabe 12. Dez 2011 17:12

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Memnarch (Beitrag 1141006)
Mich würde mal interressieren, ob es möglich ist irgendwie 16byte alignment in Delphi zu nutzen.

Ich bin mir nicht ganz sicher, was du genau erreichen willst:

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:
type
  TTest = record
    X: Single;
    Y: Single;
    Z: Single;
    W: Single;
  end align 16;
Ab wann das geht, kann ich im Moment nicht sagen; getestet habe ich es unter XE2.

shmia 12. Dez 2011 17:53

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1141014)
... sollen jeweils auf einer 16-Bit-Grenze liegen

16-Byte nicht Bit :hi:
Also 128-Bit Alignment.

Uwe Raabe 12. Dez 2011 19:34

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von shmia (Beitrag 1141018)
Zitat:

Zitat von Uwe Raabe (Beitrag 1141014)
... sollen jeweils auf einer 16-Bit-Grenze liegen

16-Byte nicht Bit :hi:
Also 128-Bit Alignment.

Klar!

Memnarch 13. Dez 2011 08:21

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:
movaps XMM0, [VecA];
movaps XMM1, [VecB];
addps XMM0, XMM1;
movups [Result], XMM0;
das ganze ist in einer funktion geschrieben, die die beiden vectoren übergeben bekommt.(vom typ TTest).

VecA u. VecB sind als const parameter deklariert.


Irgendwas läuft schief o.O

Uwe Raabe 13. Dez 2011 08:47

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Memnarch (Beitrag 1141068)
Bei dem versuch aligned zu nutzen klatschts aber gerade noch gewaltig^^.

Das align bei records funktioniert nur bei non-packed records! Dummerweise bekommt man bei einem packed record mit align auch keinen Hinweis - es wird nur einfach nicht aligned.

Ich muss auch gestehen, daß mein Wissen hierbei auch nur theoretischer Natur ist.

Memnarch 13. Dez 2011 09:07

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)

himitsu 13. Dez 2011 09:18

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?.

Memnarch 13. Dez 2011 09:31

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:
function name():TTest
asm
  movups [result], xmm0;
end;
und


Delphi-Quellcode:
function name():TTest
begin
  asm
    movups [result], xmm0;
  end;
end;
erklären? Bei letzterem würde ich nämlich nen Operandsize missmatch error bekommen o.O

TRomano 13. Dez 2011 10:25

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.

Neutral General 13. Dez 2011 10:33

AW: 16 Byte Alignment? (SSE)
 
Davon abgesehen funktioniert die 2. Methode ab XE2 nicht mehr.

Memnarch 13. Dez 2011 10:42

AW: 16 Byte Alignment? (SSE)
 
@NeutralGeneral: Da gehts dan nur mit kompletten ASM funktionen oder gar nicht, richtig?(wegen inline asm)

Uwe Raabe 13. Dez 2011 10:48

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Neutral General (Beitrag 1141110)
Davon abgesehen funktioniert die 2. Methode ab XE2 nicht mehr.

Unter 32-Bit sollte es prinzipiell schon noch gehen. Lediglich unter 64-Bit gibt es kein Inline-Assembler mehr.

himitsu 13. Dez 2011 12:33

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:
array[0..7] of Byte
oder ein Record mit 8 Byte, da der größe Eineltyp ja ein Byte ist.

himitsu 13. Dez 2011 12:35

AW: 16 Byte Alignment? (SSE)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1141117)
Zitat:

Zitat von Neutral General (Beitrag 1141110)
Davon abgesehen funktioniert die 2. Methode ab XE2 nicht mehr.

Unter 32-Bit sollte es prinzipiell schon noch gehen. Lediglich unter 64-Bit gibt es kein Inline-Assembler mehr.



Zitat:

Lediglich unter 64-Bit gibt es kein Inline-Assembler mehr.
Den sollte es noch geben (für z.B. Win32), aber es gibt keine gemischten Assembler/Pascal-Codes mehr.
> die ganze Funktion in Assembler oder garnichts (die haben es sich halt leicht gemacht und diesen MixedMode garnicht erst implementiert)

Memnarch 13. Dez 2011 14:07

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

himitsu 13. Dez 2011 14:18

AW: 16 Byte Alignment? (SSE)
 
Du könntest natürlich auch einfach FastMM einbinden. (der ist eh besser, als der alte DelphiMM)

Memnarch 13. Dez 2011 14:30

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 00:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz