问题标签 [fma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - gcc -ffp-contract 选项的区别
-ffp-contract
我对GNU GCC 中的标志有疑问(请参阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。
标志文档是这样写的:
-ffp-contract=off
禁用浮点表达式收缩。-ffp-contract=fast
如果目标具有对它们的本机支持,则启用浮点表达式收缩,例如形成融合乘加运算。-ffp-contract=on
如果语言标准允许,则启用浮点表达式收缩。这目前尚未实施,并且等同于-ffp-contract=off
. 默认值为-ffp-contract=fast
.
现在的问题:
- fast 和 on 和有什么不一样?
- 除了 FMA(或类似 fused-mult sub)之外还有其他收缩示例吗?
architecture - Fused Multiply Add 的流水线阶段是什么?
在英特尔的 Haswell 架构上,可以在 5 个周期内完成 FMA 操作 (A*B + C)。谁能解释这 5 个周期中的每一个周期会发生什么?对于乘法,我知道阶段如下:
- 分离尾数和指数
- 乘以尾数
- 乘指数
- 标准化结果
- 插入符号
但我一直无法找到 FMA 操作的流水线阶段
编辑:似乎以上不是Mult管道中使用的实际方法(感谢@EOF和@harold的提示)
c - FMA 内在函数不起作用:是硬件还是编译器?
我正在尝试使用英特尔 FMA 内在函数,例如_mm_fmadd_ps (__m128 a, __m128 b, __m128 c),以便在我的代码中获得更好的性能。
所以,首先,我做了一个小测试程序,看看它可以做什么以及我如何使用它们。
我有这个错误:
vr = 错误:从类型 'int' 分配给类型 '__m128' 时类型不兼容 vr = _mm_fmadd_ps (v1, v2, v3);
我认为可能是处理器功能不允许使用此类指令,所以我在互联网上查找了我的处理器型号(英特尔®酷睿™ i7-4700MQ 处理器),我发现它仅支持SSE4.1/4.2, AVX 2.0内在函数对我来说有点奇怪!!所以我查看了 proc/cpuinfo 文件和标志部分,我找到了 ** fma ** 标志。这是关于硬件的令人困惑的部分。
至于软件,我在互联网上进行了一些挖掘后使用了这个 makefile 选项,我希望这不是问题。
我在 Ubuntu 12.04 LTS 上使用 Eclipse,GCC 版本 4.9.4 谢谢。
cuda - fma 中每个周期的指令数是多少,带负号?
如果我在 cuda 中使用 fma(a, b, c),这意味着公式 a b+c 是在单个三元运算中计算出来的。但是如果我想计算 -a b+c,调用 fma(-a, b, c) 是否需要再进行一次乘法运算?
assembly - 为什么这段代码使用 VMULPD 写入将被 VFMADD 覆盖的寄存器?那不是没用吗?
在查看这段代码时,我注意到以下四个指令:
现在,如果您认为 AT&T 表示法中的指令是 形式的operator source,source,destination
,那么第一条指令不是没用吗?
前两个值显然从未读取过,因此不应计算它们。但是,似乎情况并非如此,因为如果我删除这些行,测试就会失败。
gcc - 此乘加代码的奇怪优化结果
我正在编译这段代码:
在最大优化下,使用 clang 6.0 和 gcc 7.3。但结果很奇怪:
- 没有编译器使用融合乘加 - 用于整数或浮点数,尽管这些似乎是显而易见的选择。为什么?
- gcc 对 int64_t 情况(不适用于 float 情况)使用了无数条指令,比 clang 多得多,也比它本身在
-O2
. 这真的更快吗?
铿锵声6.0:
海湾合作委员会 7.3:
c++ - C++ 中是否允许浮点表达式收缩?
浮点表达式有时可以在处理硬件上收缩,例如使用融合乘法和加法作为单个硬件操作。
显然,使用这些不仅仅是一个实现细节,而是受编程语言规范控制。具体来说,C89 标准不允许这样的收缩,而在 C99 中,只要定义了一些宏,它们是允许的。请参阅此 SO 答案中的详细信息。
但是 C++ 呢?不允许浮点收缩吗?在某些标准中允许吗?普遍允许?
eigen - 带有 Eigen 和 IPOPT 的矢量化标志
我有一些 C++ 函数正在使用 IPOPT 进行优化。虽然成本函数、约束函数等是用 C++ 编写的,但代码最初是使用 C 接口编写的。除非事实证明这是问题所在,否则我还没有费心去改变它。
无论如何......我们正在观察一些意想不到的行为,当我们编译带有/不带有矢量化标志的程序时,优化器会以不同的方式收敛。具体来说,在 CMakeLists 文件中,我们有
当我们使用这些设置运行优化器时,优化器会在大约 100 次迭代中收敛。到现在为止还挺好。
但是,我们有理由相信,当为 ARM(特别是 Android)编译时,不会发生矢量化,因为其性能与 Intel 处理器上的性能截然不同。Eigen 文档说应该始终为 64 位 ARM 启用 NEON 指令,但我们有理由怀疑这不会发生。无论如何,这不是这里的问题。
由于这种怀疑,我们想看看如果我们禁用矢量化,我们的英特尔处理器的性能会有多糟糕。这应该给我们一些关于向量化正在发生多少的迹象,以及我们可能期望在 ARM 中看到多少改进。但是,当我们将编译器标志更改为
(或者仅在我们只使用 AVX(没有 fma)的情况下),然后我们从优化器中得到相同的通用解决方案,但收敛性能非常不同。具体来说,在没有矢量化的情况下,优化器需要大约 500 次迭代才能收敛到解决方案。
总而言之:
我们实际上只是更改了 cmake 文件中的那一行,而不是源代码。
我想就为什么会发生这种情况提出一些建议。
我的想法和更多背景信息:
在我看来,无论是否带有矢量化的版本都必须进行一些舍入,这使得 IPOPT 收敛不同。我的印象是添加 AVX 和 FMA 标志不会改变函数的输出,而只会改变计算它们所需的时间。我好像错了。
我们观察到的现象对我来说特别奇怪,因为一方面我们观察到优化器总是收敛到相同的解决方案。这以某种方式表明问题不能太病态。然而,另一方面,优化器在有/没有矢量化标志的情况下表现不同的事实表明,该问题确实对矢量化指令生成的任何小残差敏感。
要记住的另一件事是我们将 IPOPT 预编译到一个库中,并且只是将我们的代码与该预编译库链接起来。所以我认为 AVX 和 FMA 标志不会影响优化器本身。这似乎意味着我们的函数必须输出具有明显不同值的值,具体取决于是否启用了矢量化。
对于那些感兴趣的人,这里是完整的 cmake 文件
c - 当矩阵维数不是4的倍数时如何避免AVX2的错误?
我在 C 中使用 AVX2、FMA 制作了矩阵向量乘法程序。我使用带有 -mfma、-mavx 的 GCC ver7 编译。
但是,我收到错误“已释放对象的校验和不正确 - 对象可能在被释放后被修改”。
我认为如果矩阵维度不是 4 的倍数,则会产生错误。
我知道 AVX2 使用 ymm 寄存器,可以使用 4 个双精度浮点数。因此,如果矩阵是 4 的倍数,我可以毫无错误地使用 AVX2。
但是,这是我的问题。如果矩阵不是 4 的倍数,我如何有效地使用 AVX2 ???
这是我的代码。
linux - tensorflow-1.12.0rc1-cp27-cp27mu-linux_x86_64.whl 不是这个平台支持的轮子
我使用 pip3 pip3 install --upgrade tensor flow 在 Intel NUC 上安装了张量流但出现以下错误 2018-10-25 20:14:31.685641: I tensorflow/core/platform/cpu_feature_guard.cc:141] 你的 CPU 支持这样的指令TensorFlow 二进制文件未编译使用:AVX2 FMA 无法打开 X 服务器
谷歌搜索后发现我需要从源代码构建张量流。所以我安装了 bazel 版本 - 0.18 Git 克隆张量流并签出了 1.12 版本。进一步使用以下命令: bazel build -c opt --copt=-mavx --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
pip3 安装 /tmp/tensorflow_pkg/NAME_OF_WHEEL.whl
我得到错误 tensorflow-1.12.0rc1-cp27-cp27mu-linux_x86_64.whl is not a supported wheel on this platform.
pip3 --version pip 9.0.3 来自 /usr/local/lib/python3.5/dist-packages (python 3.5)
sudo pip3 --version pip 9.0.3 来自 /usr/local/lib/python3.5/dist-packages (python 3.5)
如何解决这个问题?