gpt4 book ai didi

x86 - 是否可以矢量化 myNum += a[b[i]] * c[i];在 x86_64 上?

转载 作者:行者123 更新时间:2023-12-04 02:03:55 25 4
gpt4 key购买 nike

我将使用什么内在函数来在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com