相关疑难解决方法(0)

融合乘法加法和默认舍入模式

使用GCC 5.3,以下代码符合 -O3 -fma

float mul_add(float a, float b, float c) {
  return a*b + c;
}
Run Code Online (Sandbox Code Playgroud)

生成以下程序集

vfmadd132ss     %xmm1, %xmm2, %xmm0
ret
Run Code Online (Sandbox Code Playgroud)

我注意到GCC -O3已经在GCC 4.8中这样做了.

Clang 3.7带-O3 -mfma产品

vmulss  %xmm1, %xmm0, %xmm0
vaddss  %xmm2, %xmm0, %xmm0
retq
Run Code Online (Sandbox Code Playgroud)

但Clang 3.7与-Ofast -mfmaGCC生成的代码相同-O3 fast.

我很惊讶GCC的确如此,-O3因为从这个答案来看

除非允许使用宽松的浮点模型,否则不允许编译器融合分离的加法和乘法.

这是因为FMA只有一个舍入,而ADD + MUL有两个舍入.因此,编译器将通过融合违反严格的IEEE浮点行为.

但是,从这个链接

无论FLT_EVAL_METHOD的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度.

所以现在我感到困惑和担忧.

  1. GCC是否有理由使用FMA -O3
  2. 融合是否违反了严格的IEEE浮点行为?
  3. 如果融合确实违反了IEEE浮点运算,那么GCC的回归__STDC_IEC_559__不是一个矛盾吗?

由于FMA 可以在软件中进行仿真,因此似乎应该有两个用于FMA的编译器开关:一个用于告诉编译器在计算中使用FMA,一个用于告诉编译器硬件具有FMA.


显然,这可以通过选项进行控制-ffp-contract.对于GCC,默认是-ffp-contract=fast和Clang不一样.其他选项例如 …

c gcc clang ieee-754 fma

14
推荐指数
1
解决办法
1347
查看次数

将除以零定义为无穷大

我想将除以零的结果定义为double INF。

关于C / C ++中的默认行为(除以零)有一些讨论。(我读过)没有任何问题明确询问如何定义零除以在C中变为无穷大。这是否有意义,我宁愿不讨论。我只想用一个包含多个C函数的文件来定义它,并且需要它的语法。

c

12
推荐指数
2
解决办法
1433
查看次数

有符号零的最小值和最大值

我担心以下情况

min(-0.0,0.0)
max(-0.0,0.0)
minmag(-x,x) 
maxmag(-x,x)
Run Code Online (Sandbox Code Playgroud)

维基百科IEEE 754-2008称,关于min和max

定义了最小和最大操作,但是对于输入值相等但表示不同的情况留有一些余地.特别是:

min(+ 0,-0)或min(-0,+ 0)必须产生值为零的东西,但可能总是返回第一个参数.

我做了一些测试比较fmin,fmax,最小值和最大值定义见下文

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })
#define min(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)

_mm_min_ps_mm_max_ps其称之为SSE minpsmaxps指令.

以下是结果(我用来测试的代码发布在下面)

fmin(-0.0,0.0)       = …
Run Code Online (Sandbox Code Playgroud)

c c++ floating-point sse ieee-754

8
推荐指数
1
解决办法
749
查看次数

如何检查是否使用了IEEE 754单精度(32位)浮点表示?

我想在目标板上测试以下内容:

  • 使用IEEE 754单精度(32位)浮点变量实现'float'吗?
  • 使用IEEE 754双精度(64位)浮点变量实现"双重"吗?

有什么方法可以用简单的C程序测试它.

c algorithm floating-point double

5
推荐指数
1
解决办法
3513
查看次数

标签 统计

c ×4

floating-point ×2

ieee-754 ×2

algorithm ×1

c++ ×1

clang ×1

double ×1

fma ×1

gcc ×1

sse ×1