Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在16字节边界上手动修复sse2数据对齐的替代方法_Delphi_Windows 7_32 Bit_Memory Alignment_Sse2 - Fatal编程技术网

Delphi 在16字节边界上手动修复sse2数据对齐的替代方法

Delphi 在16字节边界上手动修复sse2数据对齐的替代方法,delphi,windows-7,32-bit,memory-alignment,sse2,Delphi,Windows 7,32 Bit,Memory Alignment,Sse2,是否有以下手动修复的替代方案: // 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)) +

是否有以下手动修复的替代方案:

// 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;

请注意,这段代码要么在过程中,要么在函数中嵌入。

标准方法是使用内存管理器,将16字节边界上的块对齐。FastMM将执行此操作,但您需要完整版本才能配置此选项


另外请注意,您问题中的代码尚未准备好64位,因为它将指针转换为4字节整数。

如果您使用的是新版本的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个字节。

重新标记我的帖子:我使用的是Windows 7/32位,只要有可能,它总是值得在任何平台上编写代码。NativeInt是应该在Q中的代码中使用的。谢谢David。这很有趣,我正在等待Delphi XE2的继任者切换到64位,并将Linux作为一个选项。引用Embarcadero RAD Studio关于SetMinimumBlockAlignment的帮助说明:
通过内存管理器分配的内存保证至少与8字节边界对齐。当使用SSE指令操作内存块时,16字节对齐非常有用,但可能会增加内存使用开销
@menjaraz:如果代码中不再需要16字节对齐,可以使用
SetMinimumBlockAlignment(mba8Byte)
将其返回到8字节对齐。它只会影响新分配的内存。@menjaraz:我还应该提到,您可能会在手动修复中浪费一些内存。但是如果您将块对齐设置回8字节对齐,内存管理器将重用以前16字节对齐内存分配中可能的内存浪费。您是对的。寻求实现16字节对齐可能会招致一些内存使用惩罚。尽管如此,以手动方式执行此操作并不需要还原操作,因为内存管理器的最小块对齐保持不变。是的,但请记住,将对齐设置回8字节将重新使用以前浪费的内存,而手动修复中不会出现这种情况。