gpt4 book ai didi

Delphi 数组对齐设置为 4、8 或 16 字节边界?

转载 作者:行者123 更新时间:2023-12-02 20:02:46 31 4
gpt4 key购买 nike

我想使用 Delphi 2009 中的 FFTW C 库并根据本文档;

http://www.fftw.org/install/fftw_usage_from_delphi.txt

为了提高 FFTW 库内的性能(以便它可以使用 SIMD 扩展),传入的 Single(浮点)或 Double( double )数组需要在 4 或 8 字节边界对齐。我发现文档讨论了记录结构的对齐,但没有具体介绍数组。有没有办法在 Delphi 2009 中做到这一点。

因此代码(从上述文档复制)将如下所示;

var
in, out : Array of Single; // Array aligned at 4 byte boundary
plan : Pointer;

{$APPTYPE CONSOLE}

begin

...

SetLength(in, N);
SetLength(out, N);

plan := _fftwf_plan_dft_1d(dataLength, @in[0], @out[0],
FFTW_FORWARD, FFTW_ESTIMATE);

还在上面的文档中,他们讨论了 8 和 16 字节边界,但在我看来应该是 4 和 8 字节边界,如果有的话可以明确这一点那就太好了。

谢谢,布鲁斯

最佳答案

请注意,您可以使用您可能需要的任何自定义对齐方式创建数据结构。例如,要在 128 字节边界上对齐 FFT 数据:

procedure TForm1.Button1Click(Sender: TObject);
type
TFFTData = array[0..63535] of double;
PFFTData = ^TFFTData;
var
Buffer: pointer;
FFTDataPtr: PFFTData;
i: integer;
const
Alignment = 128; // needs to be power of 2
begin
GetMem(Buffer, SizeOf(TFFTData) + Alignment);
try
FFTDataPtr := PFFTData((LongWord(Buffer) + Alignment - 1)
and not (Alignment - 1));

// use data...
for i := Low(TFFTData) to High(TFFTData) do
FFTDataPtr[i] := i * pi;

finally
FreeMem(Buffer);
end;
end;

编辑:

关于分配内存两倍的注释:堆栈变量 FFTData 的类型为 PFFTData,而不是 TFFTData,因此它是一个指针。这并不那么明显,因为语法增强允许省略 ^ 来取消引用指针。内存是通过 GetMem() 分配的,并且为了使用正确的类型而不是使用类型转换的无类型内存块。我应该将其命名为 FFTDataPtr。

关于Delphi 数组对齐设置为 4、8 或 16 字节边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846965/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com