作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将使用什么内在函数来在 x86_64 上对以下内容进行矢量化(如果甚至可以进行矢量化)?
double myNum = 0;
for(int i=0;i<n;i++){
myNum += a[b[i]] * c[i]; //b[i] = int, a[b[i]] = double, c[i] = double
}
最佳答案
这是我的做法,经过全面优化和测试:
#include <emmintrin.h>
__m128d sum = _mm_setzero_pd();
for(int i=0; i<n; i+=2) {
sum = _mm_add_pd(sum, _mm_mul_pd(
_mm_loadu_pd(c + i),
_mm_setr_pd(a[b[i]], a[b[i+1]])
));
}
if(n & 1) {
sum = _mm_add_pd(sum, _mm_set_sd(a[b[n-1]] * c[n-1]));
}
double finalSum = _mm_cvtsd_f64(_mm_add_pd(
sum, _mm_shuffle_pd(sum, sum, _MM_SHUFFLE2(0, 1))
));
使用
gcc -O2 -msse2
生成非常漂亮的汇编代码(4.4.1)。
n
将使这个循环运行得更快以及对齐
c
.如果可以对齐
c
, 改
_mm_loadu_pd
至
_mm_load_pd
以获得更快的执行时间。
关于x86 - 是否可以矢量化 myNum += a[b[i]] * c[i];在 x86_64 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350116/
我想定义一个新的抽象数据类型,它可以是通用数字或除法结构。我将如何在 Haskell 中做到这一点? 我的第一个方法是: data MyMath = MyNum Num | D
我将使用什么内在函数来在 x86_64 上对以下内容进行矢量化(如果甚至可以进行矢量化)? double myNum = 0; for(int i=0;i __m128d sum = _mm_setz
我是一名优秀的程序员,十分优秀!