2

次の手動修正に代わるものはありますか?

// excerpt adapted from SIMDTest in   
// http://www.mccauslandcenter.sc.edu/mricro/obsolete/graphics/simdtest.zip
//
var
  lAdblRAp, lArraySz, lAdblRA, Doublep: LongInt;
begin
  // ...
  GetMem(lAdblRAp,(lArraySz * SizeOf(Double)) + 32);
  lAdblRA := Doublep((Integer(lAdblRAp) and $FFFFFFF0) + 16);
  // ...
end;

このコードは、プロシージャまたは関数のいずれかに埋め込まれていることに注意してください。

4

2 に答える 2

3

標準的な方法は、16バイト境界でブロックを整列させるメモリマネージャーを使用することです。FastMMはこれを行いますが、このオプションを構成できるようにするにはフルバージョンが必要です。

また、質問のコードは4バイト整数へのポインターをキャストするため、64ビットの準備ができていないことにも注意してください。

于 2012-02-23T08:08:31.877 に答える
2

新しいバージョンのDelphi(XEとXE2でテスト済み)を使用している場合、最も簡単な方法はSetMinimumBlockAlignment(mba16Byte)、コードの最初の場所で呼び出すことです。

次に、通常GetMemの、Newまたは任意のメモリ割り当て関数を呼び出し、アドレスが16バイト境界に揃えられていることを確認します

編集:

また、手動修正を使用する場合、メモリの浪費を減らす最も効率的な方法は次のとおりです。

var
  lArraySz: LongInt;
  lAdblRAp, lAdblRA: Pointer;     

begin
  // ...
  GetMem(lAdblRAp,(lArraySz * SizeOf(Double)) + 16);
  lAdblRA := Pointer((Integer(lAdblRAp) + 15) and $FFFFFFF0));
  // ...
end;

割り当てごとに16バイト少なくなります。

于 2012-02-23T10:49:05.093 に答える