- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题适用于 Haswell 上带有 XMM/YMM 寄存器的打包、单精度浮点运算。
所以根据真棒,真棒table由 Agner Fog 汇总,我知道 MUL 可以在端口 p0 和 p1 上完成(recp 吞吐量为 0.5),而 ADD 仅在端口 p1 上完成(recp 吞吐量为 1)。我可以排除这个限制,但我也知道 FMA 可以在端口 p0 或 p1 上完成(recp 吞吐量为 0.5)。因此,当 FMA 可以使用 p0 或 p1 并且它同时执行 ADD 和 MUL 时,为什么普通 ADD 仅限于 p1,这让我感到困惑。我是不是对 table 有什么误解?或者有人可以解释为什么会这样吗?
也就是说,如果我的阅读是正确的,那么英特尔为什么不直接使用 FMA 操作作为普通 MUL 和普通 ADD 的基础,从而提高 ADD 和 MUL 的吞吐量。或者,什么会阻止我使用两个同时、独立的 FMA 操作来模拟两个同时、独立的 ADD 操作?执行 ADD-by-FMA 会受到哪些处罚?显然,使用了更多数量的寄存器(ADD 的 2 个寄存器 vs ADD-by-FMA 的 3 个寄存器),但除此之外?
最佳答案
您并不是唯一一个对英特尔为何这样做感到困惑的人。阿格纳·雾在他的micro-architecture Haswell 的手册写道:
It is strange that there is only one port for floating point addition, but two ports for floating point multiplication.
在阿格纳的留言板上he also writes
There are two execution units for floating point multiplication and for fused multiply-and-add, but only one execution unit for floating point addition. This design appears to be suboptimal since floating point code typically contains more additions than multiplications.
该主题继续提供有关该主题的更多信息,我建议您阅读这些信息,但我不会在此处引用。
他也在这个答案中讨论了这个问题 flops-per-cycle-for-sandy-bridge-and-haswell-sse2-avx-avx2
The latency of FMA instructions on Haswell is 5 and the throughput is 2 per clock. This means that you must keep 10 parallel operations going to get the maximum throughput. If, for example, you want to add a very long list of f.p. numbers, you would have to split it in ten parts and use ten accumulator registers.
This is possible indeed, but who would make such a weird optimization for one specific processor?
他的回答基本上回答了你的问题。您可以使用 FMA 使加法吞吐量加倍。事实上,我在加法吞吐量测试中这样做了,并且确实看到它翻倍了。
总而言之,如果您的计算受延迟限制,则不要使用 FMA,而应使用 ADD。但如果吞吐量有限,您可以尝试使用 FMA(通过将乘数设置为 1.0),但您可能必须使用许多 AVX 寄存器来执行此操作。
我展开了 10 次以获得最大吞吐量 loop-unrolling-to-achieve-maximum-throughput-with-ivy-bridge-and-haswell
关于sse - 对于Intel Haswell上的XMM/YMM FP操作,可以使用FMA代替ADD吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861416/
什么时候使用 fp:strict 而不是 fp:precise?如果我想要“更精确”的计算并避免舍入误差,使用前者是否更好?使用这两者背后的启发是什么? 最佳答案 标准 IEEE 754 指定了一种用
我检测到发布版本和调试版本之间的程序结果存在一些差异。经过一些研究,我意识到一些浮点优化导致了这些差异。我已经通过使用 fenv_access pragma 禁用一些关键方法的优化来解决了这个问题。
我在 Built-in Functions — Python 3.7.0 documentation 中阅读了内置函数 iter 的示例 with open('mydata.txt') as fp:
我在 Built-in Functions — Python 3.7.0 documentation 中阅读了内置函数 iter 的示例 with open('mydata.txt') as fp:
我一直在查找一些用 C 语言读取文件的例子,我看到了这两个例子 fgets(buff,255,(FILE*)fp); 和 fgets(buff,255,fp); 假设 fp 是前面定义的文件指针 "F
我是 FP-TS 的新手,但仍然不太明白如何使用 TaskEither .我正在尝试异步读取文件,然后使用 yaml-parse-promise 解析结果字符串。 ==编辑== 我用文件的完整内容更新
我需要在我的 Mac 上编译一个 C 文件,该文件是在仅假设 Linux 和 GCC 环境下编写的。该文件包含一行 if(fp->_IO_write_base == fp->_IO_write_end
for line in fp 和 for line in fp.readlines() 有什么区别? with open(filename, 'r') as fp : for line in
这可能非常无聊,但谷歌搜索确实没有帮助。 在python官方文档中,它经常将文件称为fp: with open(filename, "w") as fp: fp.write() “p”代表什么? 最佳
我想知道如果我设置/fp:fast 而不是 fp:precise 会遇到什么样的错误?我在 MSV10 下工作 我对最大位数为 8 的 double 执行/,*,+,- 运算,例如 1.4379294
我正在使用 Groovy 进行一个项目,我想采用一个员工数组,这样在数组中没有经理跟随他们的下属。原因是我需要将人员添加到数据库中,我不希望分两次完成。 所以,我基本上有: 12
背景: 许多年前,我继承了一个代码库,该代码库使用 Visual Studio (VC++) 标志“/fp:fast”在特定的计算量大的库中生成更快的代码。不幸的是,'/fp:fast' 产生的结果与
我正在尝试从PostgreSQL数据库检索数据,将其转换为视图模型数组,并将数据返回给客户端,在本例中最好是作为单个对象,而不是数组。对于我在错误消息下面列出的代码,我收到以下错误。我是函数式编程领域
所以我尝试将此类 Matlab 代码转换为 C++: ss = 'file.mask' fp = fopen(ss, 'rb'); sx = fread(fp, 1, 'int32') sy = f
我是fp-ts的新手,请帮助我解决问题: 我需要使用异步功能在不同级别上多次记录同一错误。这是我的示例代码: const myProgram = pipe( tryCatch(() => so
我正在尝试在为浏览器编写的库中使用 lodash/fp。我正在使用 Webpack 来打包我的库。 在我的代码中,我当前加载 lodash/fp 如下(ES2015 样式。我使用 Babel 对其进行
我的问题是引用 this post ,具体来说: data Actions a = Actions { actEval :: a, actMap :: (a -> a) -> Act
我正在阅读 FP,我有两个基本问题: FP 表示函数应该接受一个输入并给出单个输出。那么我该怎么办void方法?它不返回任何东西吗? FP 说函数应该是单一的 责任,那我们怎么处理log方法内的语句?
我是 c 初学者,所以我在让用户输入姓氏、逗号和名字时遇到问题。但是它将传递给函数调用 int get_name(FILE *fp) 在我的主要功能中。如果我必须使用参数参数,我就会遇到问题。 示例,
我有一些这样的序列 (100) - (102) - (103) - (104,106) - (108) (101) - (103) (102) - (106) 在 C++ 中有一些有效的实现前缀树或
我是一名优秀的程序员,十分优秀!