使用SSE(fma)编译Delphi单元
在Free Pascal中,您可以通过来自的条件定义确定代码是否使用SSE2/3/64指令编译 , 表G.3:使用FPC编译时可能的FPU定义使用SSE(fma)编译Delphi单元,delphi,sse,freepascal,Delphi,Sse,Freepascal,在Free Pascal中,您可以通过来自的条件定义确定代码是否使用SSE2/3/64指令编译 , 表G.3:使用FPC编译时可能的FPU定义 FPUSSE2 SSE 2 instructions on Intel I386 and higher. FPUSSE3 SSE 3 instructions on Intel I386 and higher, AMD64. FPUSSE64 SSE64 FPU on Intel I386 and higher, AMD64. 我知道D
FPUSSE2 SSE 2 instructions on Intel I386 and higher.
FPUSSE3 SSE 3 instructions on Intel I386 and higher, AMD64.
FPUSSE64 SSE64 FPU on Intel I386 and higher, AMD64.
我知道Delphi 64位编译器在Win RTL中使用SSE,但我的问题是:
如果使用SSE指令编译单元,特别是如果使用硬件fma指令计算a*b+c
,Delphi中是否有已知的方法在编译时检查
如果一个单元是用SSE指令编译的,Delphi中有没有已知的方法在编译时进行检查
在英特尔平台上,如果定义了CPUX64
条件,则编译器将使用SSE指令生成浮点代码。否则,将生成x87指令
没有Delphi编译器使用FMA指令生成代码。dcc64使用的浮点codegen自最初在XE2中发布以来没有发生重大变化 如果一个单元是用SSE指令编译的,Delphi中有没有已知的方法在编译时进行检查 在英特尔平台上,如果定义了
CPUX64
条件,则编译器将使用SSE指令生成浮点代码。否则,将生成x87指令
没有Delphi编译器使用FMA指令生成代码。dcc64使用的浮点codegen自最初在XE2中发布以来没有发生重大变化 谢谢,但不幸的是,至少Delphi17/18似乎没有在函数fma_d(a,b,c:double):double中使用fma;内联;开始fma_d:=a*b+c;结束代码>没有任何Delphi编译器使用此类指令生成代码。自XE2以来,Codegen没有显著变化。是的,它生成了这些指令:
mulsd xmm0,xmm1
和addsd xmm0,xmm2
(对我来说,这看起来不像fma)。但通过这个,我得到了D18测试套件的以下错误RMS=2.11,max rel=207.87 eps,用我的软件解决方案,我得到RMS=0.21,max rel=0.50 eps,FPC给出RMS=0.02,max rel=0.48 eps,我不知道你想让我说什么。Delphi不会生成FMA指令。你认为为什么会这样?D17或D18是什么?请使用常用的名称。我看不出为什么你不能使用那些,而不是一些模糊的版本号。谢谢你,但不幸的是,至少Delphi17/18在函数fma_d(a,b,c:double):double;内联;开始fma_d:=a*b+c;结束代码>没有任何Delphi编译器使用此类指令生成代码。自XE2以来,Codegen没有显著变化。是的,它生成了这些指令:mulsd xmm0,xmm1
和addsd xmm0,xmm2
(对我来说,这看起来不像fma)。但通过这个,我得到了D18测试套件的以下错误RMS=2.11,max rel=207.87 eps,用我的软件解决方案,我得到RMS=0.21,max rel=0.50 eps,FPC给出RMS=0.02,max rel=0.48 eps,我不知道你想让我说什么。Delphi不会生成FMA指令。你认为为什么会这样?D17或D18是什么?请使用常用的名称。我看不出有什么理由不能使用这些,而不是一些模糊的版本号。