Delphi-PRAXiS
Seite 1 von 3  1 23      

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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Seite 1 von 3  1 23      

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