【问题标题】:Alternative to manual fix-up of sse2 data alignement on a 16-byte boundary替代手动修复 16 字节边界上的 sse2 数据对齐
【发布时间】:2012-03-13 13:28:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi windows-7 32-bit memory-alignment sse2


    【解决方案1】:

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

    另请注意,您问题中的代码不是 64 位就绪的,因为它会将指针转换为 4 字节整数。

    【讨论】:

    • 重新标记我的帖子:我使用的是 Windows 7 / 32 位
    • 总是值得编写可以在任何平台上运行的代码,如果可能的话。 NativeInt 是应该在 Q 中的代码中使用的。
    • 谢谢大卫。这很有趣,我正在等待 Delphi XE2 的继任者切换到 64 位,并以 Linux 为目标。
    【解决方案2】:

    如果您使用的是新版本的 Delphi(我已经使用 XE 和 XE2 进行了测试),最好和最简单的方法是在代码的第一个位置调用 SetMinimumBlockAlignment(mba16Byte)

    然后调用常规的GetMemNew 或任何内存分配函数,并确保地址与 16 字节边界对齐

    编辑:

    此外,如果您更喜欢使用手动修复,那么浪费更少内存的最佳有效方法如下:

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

    每次分配都会少用 16 个字节。

    【讨论】:

    • +1。引用 Embarcadero RAD Studio 关于 SetMinimumBlockAlignment 的帮助说明:Memory allocated through the Memory Manager is guaranteed to be aligned to at least 8-byte boundaries. 16-byte alignment is useful when memory blocks will be manipulated using SSE instructions, but may increase the memory usage overhead.
    • @menjaraz:如果您的代码不再需要 16 字节对齐,您可以使用 SetMinimumBlockAlignment(mba8Byte) 将其恢复为 8 字节对齐。它只会影响新分配的内存。
    • @menjaraz:我还应该提到,您在手动修复中也可能会浪费一些内存。但是如果将块对齐设置回 8 字节对齐,内存管理器将重用之前 16 字节对齐内存分配中可能存在的内存浪费。
    • 你是对的。无论哪种方式,寻求达到 16 字节对齐都可能会导致一些内存使用损失。尽管如此,以手动方式执行此操作并不需要恢复操作,因为内存管理器的最小块对齐保持不变。
    • 是的,但请记住,将对齐设置回 8 字节,将重用先前浪费的内存,这不会在手动修复中发生。
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2020-03-26
    相关资源
    最近更新 更多