-qfloat
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qfloat | ✓ | ✓ | ✓ | ✓ |
类别
等效编译指示
| xlc/xlC 和其他遗留的调用命令 | xlclang/xlclang + + 调用命令 |
|---|---|
| #pragma 选项浮点 | 无 |
用途
选择不同的策略来提高浮点计算的速度或准确性。
语法
缺省值
- -qfloat=dfpemulate:nofenv:nofltint:fold:nohscmplx:nohsflt:nohssngl:maf: nonans:norelax:rndsngl:rngchk:norrm:norsqrt:single:nospnans:nosubnormals

- -qfloat=nofenv:fold:nohscmplx:nohsflt:maf:nonans:norelax: rngchk:norrm:norsqrt: nospnans:nosubnormals

- -qfloat=fltint:rsqrt:norngchk:nosubnormals (当 -qnostrict, -qstrict=nooperationprecision:noexceptions或 -O3 或更高优化级别生效时)。
参数
dfpemulate | nodfpemulate- 指定是在硬件指令中实现十进制浮点计算,还是通过调用库函数在软件中进行仿真。 诺德夫皮马特 仅在支持十进制浮点指令的系统上有效; 即,系统 具有有效的 -qarch=pwr6 或更高版本。 nodfpemulate 是这些系统的建议设置,可提高十进制浮点运算的性能和整体程序运行时性能。 所有其他 -qarch 值都需要 dfpemulate 。
请注意,还必须启用 -qdfp 才能使任一子选项生效。 否则,将设置 nodfpemulate 。
- fenv | nofenv
- 指定代码是否依赖于硬件环境,以及是否禁止由于这种依赖关系而可能导致意外结果的优化。
某些浮点运算依赖于浮点状态和控制寄存器 (FPSCR) 的状态,例如,控制舍入方式或检测下溢。 特别是,许多编译器内置函数都是直接从 FPSCR中读取值。
当 nofenv 生效时,编译器假定程序不依赖于硬件环境,并且允许进行将更改浮点运算顺序的激进编译器优化。 当 fenv 生效时,将禁止此类优化。
要防止可能导致意外行为的优化,您应该将 fenv 用于以下代码:包含的语句将读取或设置硬件浮点环境。
源代码中指定的任何伪指令 (例如标准 C FENV_ACCESS pragma) 优先于选项设置。
fltint | nofltint- 通过使用代码的内联序列(而不是调用库函数)来加快浮点到整数的转换速度。 库函数(在 nofltint 生效时调用)将检查可表示整数范围之外的浮点值,并在传递超出范围的浮点值时返回最小或最大可表示整数。
如果 -qarch 设置为具备从浮点转换为整数的指令的处理器,那么无论 [no]fltint 设置如何,都将使用该指令。 此转换也适用于 64 位方式下的所有 Power ® 处理器。
如果你使用 -O3 或更高的优化级别进行编译,则会自动启用 fltint。 要将其禁用,还请指定 -qstrict, -qstrict=operationprecision或 -qstrict=exceptions。
- fold | nofold
- 在编译时对常量浮点表达式求值,这样产生的结果可能与运行时求值结果略有不同。 编译器始终对规范语句中的常量表达式求值,即使您指定了 nofold 也是如此。
-qfloat=[no]fold 选项将替换不推荐使用的 -q[no]fold 选项。 在新应用程序中使用 -qfloat=[no]fold 。
- hscmplx | nohscmplx
- 加快涉及复数除法和复数绝对值的操作。 此子选项提供了 hsflt 子选项的优化子集,首选用于复数计算。
- hsflt | nohsflt
- 通过防止单精度表达式的舍入以及通过与除数的倒数相乘来替换浮点除法,从而加快计算速度。 它还使用与用于浮点到整数转换的 fltint 子选项相同的方法。 hsflt 表示 hscmplx。
hsflt 子选项将覆盖 nans 和 spnans 子选项。
注: 在执行复杂除法和浮点转换 (其中浮点计算具有已知特征) 的应用程序上使用 -qfloat=hsflt 。 特别是,所有浮点结果都必须在定义的单精度表示范围内。 请谨慎使用,因为此选项可能会生成意外结果而不发出警告。 对于复数计算,建议您使用 hscmplx 子选项 (如上所述),此子选项提供等价的加速,且不会产生 hsflt 的不良结果。
hssngl | nohssngl指定仅当结果存储到内存位置时(而不是在表达式求值后)才对单精度表达式进行舍入。 使用 hssngl 可以提高运行时性能,并且比使用 hsflt 更安全。
当 -qfloat=nosingle 生效时,此选项仅影响强制转换为单精度 (浮点) 的双精度 (双精度) 表达式,并在为其生成商店指令的赋值运算符中使用。 如果正在使用缺省 -qfloat=single 进行编译,请不要使用此选项。
- maf | nomaf
- 通过在合适的情况下使用浮点乘加指令,使浮点计算更快,更准确。 结果可能与在编译时或在其他类型的计算机上执行的类似计算的结果不完全相等。 产生的结果可能会负数和零。 这些运算将反向舍入为负无穷大或正无穷大。 此子选项可能会影响浮点中间结果的精度。 如果指定了 -qfloat=nomaf ,那么将不会生成 multiply-add 指令,除非正确性需要这些指令。
-qfloat=[no]maf 选项将替换不推荐使用的 -q[no]maf 选项。 在新应用程序中使用 -qfloat=[no]maf 。
- nans | nonans
- 允许您使用 -qflttrap=invalid:enable 选项来检测和处理涉及发信号 NaN(非数字)值的异常情况。 仅当程序显式创建发信号 NaN 值时才使用此子选项,因为这些值绝不是来自其他浮点运算。
hsflt 选项覆盖 nans 选项。
-qfloat=[no]nans 选项将取代不推荐使用的 -qfloat=[no]spnans 选项和 -q[no]spnans 选项。 在新应用程序中使用 -qfloat=[no]nans。
- 松弛 | no放轻松
- 稍微放松严格的 IEEE 一致性以获得更大的速度,通常是通过移除一些琐碎的浮点运算,例如涉及右边的零的添加和减法。 如果指定了 -qstrict=noieeefp 或 -qfloat=relax ,那么允许进行这些更改。
rndsngl | norndsngl- 将每个单精度运算的结果舍入到单精度,而不是等到对完整表达式求值为止。 它牺牲了速度,以便与其他类型计算机上类似计算的结果保持一致。
此选项仅影响从双精度表达式到单精度的类型强制转换。 仅当 -qfloat=nosingle 生效时,才能指定 norndsngl 。
hsflt 子选项覆盖 rndsngl 选项。
- rngchk | norngchk
- 在优化级别 -O3 及更高级别以及在没有 -qstrict 的情况下,控制是否对软件分割和内联平方根运算的输入参数执行范围检查。 如果指定 norngchk,那么会指示编译器跳过范围检查,这样在循环中重复执行除法和平方根运算的情况下可以提高性能。请注意,在 norngchk 生效时,以下限制适用:
- 除法运算的被除数不得是 +/-INF。
- 除法运算的除数不得是 0.0、+/- INF 或反规范化值。
- 被除数除以除数的商不得是 +/-INF。
- 平方根运算的输入不得是 INF。
仅当 -qnostrict 生效时,才允许 norngchk 。 如果 -qstrict、-qstrict=infinities、-qstrict=operationprecision 或 -qstrict=exceptions 有效,那么将忽略 norngchk。
- rrm | norrm
- 通过告知编译器,浮点舍入方式在运行时可能更改或并非是舍入到最近的,以此来防止需要舍入方式的浮点优化在运行时变为缺省设置。 如果程序通过任何方法更改运行时舍入方式,那么应使用 rrm;否则,程序可能会计算不正确的结果。
-qfloat=[no]rrm 选项将替换不推荐使用的 -q[no]rrm 选项。 在新应用程序中使用 -qfloat=[no]rrm 。
- rsqrt | norsqrt
- 将除以平方根的结果替换为乘以平方根的倒数,可以加速某些计算。
除非同时指定了 -qignerrno ,否则 rsqrt 无效;
errno将 不 为任何sqrt函数调用设置。如果您使用 -O3 或更高的优化级别进行编译,则会自动启用 fltint。 要将其禁用,还请指定 -qstrict, -qstrict=nans, -qstrict=infinities, -qstrict=zerosigns或 -qstrict=exceptions。
单数 | 复数- 允许为单精度浮点值生成单精度算术指令。 所有 Power 处理器都支持单精度指令; 但是,如果您 希望 保留针对较早体系结构编译的应用程序的行为,在这些应用程序中,所有浮点运算都以双精度执行,然后截断为单精度,那么可以使用 -qfloat=nosingle:norndsngl。 此子选项提供与不推荐的选项 -qarch=com|pwr|pwrx|pwr2|p2sc|601|602|603提供的计算精度结果。 只能以 32 位方式指定 -qfloat=nosingle 。
- spnans | nospnans
- 生成额外指令以检测从单精度到双精度转换时的信令 NaN 。
hsflt 子选项覆盖 spnans 子选项。
- subnormals | nosubnormals
- 指定代码是否使用子规范浮点值(也称为反规范化浮点值)。 是否指定此子选项,程序
的行为不会变化,但是编译器将使用此信息获
得可能的性能提高。注意 :此子选项在 POWER8 或更高版本的处理器上生效。
使用量
如果系统不满足给定子选项的所有必需条件,那么使用缺省设置之外的 -qfloat 子选项可能会在浮点计算中产生不正确的结果。 因此,仅当处理涉及 IEEE 浮点值的浮点计算并且可以正确地评估在程序中引入错误的可能性时,才能使用此选项。
如果 -qstrict | -qnostrict 和 float 子选项冲突,那么使用指定的最后一个设置。
预定义的宏
__IBM_DFP_SW_EMULATION__ 在 -qfloat=dfpemulate 生效时预定义为值 1; 否则未定义。
示例
myprogram.c 以便在编译时对常量浮点表达式求值并且不生成乘法添加指令,请输入:xlc myprogram.c -qfloat=fold:nomaf
