Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: SIMD-Dll in asm für Delphi

  Alt 23. Dez 2003, 15:23
Hallo Mathias,

herzlich willkommen bei der Delphi-PRAXiS!

Das Schlüsselwort packed bewirkt genau das Gegenteil von dem, was Du möchtest, hat aber erst dann Auswirkungen, wenn mehr als ein Feld in einem Record vorhanden ist...

Zur Ausrichtung Deines Feldes auf 16 Byte-Grenzen gibt es in Delphi leider keine Compileroptionen oder Attribute bei der Deklaration. Wenn Du allerdings den Auffwand nicht scheust, könntest Du mit dynamische alloziertem Speicher arbeiten, etwa in der Form:
Delphi-Quellcode:
type
  TMyMatrix = array[0..15] of Single;
  PMyMatrix = ^TMyMatrix;

//...
var
  myPointer: Pointer;
  myMatrix : PMyMatrix;
begin
  // allocate memory with 15 Bytes "extra space"
  GetMem(myPointer, SizeOf(TMyMatrix)+15);
  try
    // calculate offset with 16 Byte alignment within memory frame
    myMatrix:= PMyMatrix((Integer(myPointer)+$0F) and $FFFFFFF0);
    // initialize memory
    ZeroMemory(myMatrix, SizeOf(TMyMatrix));

    myMatrix^[0]:= 1.0;
    myMatrix^[1]:= 2.0;
    // call routine with reference
    DoSth(myMatrix);
  finally
    FreeMem(myPointer);
  end;
end;
problematisch an dem Ansatz sind allerdings die "verschendeten Bytes am Ende" und die Tatsache, dass Du zu jedem Record eine weitere Referenz auf den tatsächlich alloziiertem Datenbereich halten musst.
Sicherlich ist hier etwas in der Art eines "Nodemanagers" denkbar, trotzdem bleibt ein gewisser Mehraufwand...
gruß, choose
  Mit Zitat antworten Zitat