作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试向量化一些对性能极为关键的代码。在高层次上,每次循环迭代从一个小数组中的非连续位置读取六个浮点数,然后将这些值转换为 double 并将它们添加到六个不同的 double 累加器中。这些累加器在迭代中是相同的,因此它们可以存在于寄存器中。由于算法的性质,使内存访问模式连续是不可行的。不过,该阵列小到足以放入 L1 缓存,因此内存延迟/带宽不是瓶颈。
我愿意使用汇编语言或 SSE2 内在函数来并行化它。我知道我需要一次将两个浮点数加载到 XMM 寄存器的两个低位双字中,然后使用 cvtps2pd
将它们转换为两个 double 数。 ,然后使用 addpd
将它们一次添加到两个累加器中.
我的问题是,如果两个浮点数在内存中不相邻,如何将它们放入单个 XMM 寄存器的两个低位双字中?显然,任何速度太慢以至于违背并行化目的的技术都是没有用的。 ASM 或 Intel/GCC 内在函数的答案将不胜感激。
编辑:
最佳答案
对于这种特定情况,请查看说明引用手册中的解包和交错说明。它会是这样的
movss xmm0, <addr1>
movss xmm1, <addr2>
unpcklps xmm0, xmm1
shufps
,每当您以错误的顺序获得所需的数据时,这都很方便。
关于performance - SSE2 : How To Load Data From Non-Contiguous Memory Locations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850431/
我是一名优秀的程序员,十分优秀!