Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
使用SSE(fma)编译Delphi单元_Delphi_Sse_Freepascal - Fatal编程技术网

使用SSE(fma)编译Delphi单元

使用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

在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. 
我知道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是什么?请使用常用的名称。我看不出有什么理由不能使用这些,而不是一些模糊的版本号。