首页 > 解决方案 > SSE2 内在函数在哪里存储结果?

问题描述

我正在将第一步转移到 C++ 中的 SSE2。这是我现在正在学习的内在:

__m128d _mm_add_pd (__m128d a, __m128d b)

该文档说:在 a 和 b 中添加压缩双精度(64 位)浮点元素,并将结果存储在 dst 中。

但我从不传递dst给那个函数。那么,如果我不通过它,它如何将我通过的两个双精度(通过指针)添加到结果数组中呢?

标签: c++ssesimdintrinsicssse2

解决方案


内在函数返回计算结果,因此您可以将其存储在变量中或将其用作另一个参数。

这里要注意的重要一点是,大多数 SIMD 指令并不直接在内存上操作,但您需要像在汇编中那样显式加载 ( _mm_load(u)_pd) 和存储 ( ) 双精度值。_mm_store(u)_pd中间值很可能存储在 SSE 寄存器中,或者如果使用的寄存器过多,则存储在堆栈中。

所以如果你想总结两个双数组,你会做类似的事情

double a[N];
double b[N];
double c[N];
for (int i = 0; i < N; i += 2) {  // We load two doubles every time
    auto x = _mm_loadu_pd(a + i); // We don't know anything about alignment
    auto y = _mm_loadu_pd(b + i); // So I assume the load is unaligned
    auto sum = _mm_add_pd(x, y);  // Compute the vector sum
    _mm_storeu_pd(c + i, sum);    // The store is unaligned as well
}

推荐阅读