c++ - SSE2 内在函数在哪里存储结果?
问题描述
我正在将第一步转移到 C++ 中的 SSE2。这是我现在正在学习的内在:
__m128d _mm_add_pd (__m128d a, __m128d b)
该文档说:在 a 和 b 中添加压缩双精度(64 位)浮点元素,并将结果存储在 dst 中。
但我从不传递dst
给那个函数。那么,如果我不通过它,它如何将我通过的两个双精度(通过指针)添加到结果数组中呢?
解决方案
内在函数返回计算结果,因此您可以将其存储在变量中或将其用作另一个参数。
这里要注意的重要一点是,大多数 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
}
推荐阅读
- css - 网格框之间的 SVG 线
- mysql - 如何从同一列中减去一列的平均值?
- graph - 贪心和最佳优先搜索算法有什么区别?
- cmake - CMake:将 add_library 与许多源一起使用并在 target_link_libraries 中使用时出现链接错误
- java - 暴露客户端机密是否对 oauth 2 中的隐式授权类型构成威胁?
- cloud-foundry - 我需要 cloud Foundry api 来查看日志
- node.js - Firebase 函数承诺无法正确触发
- android-architecture-components - 如何将统一响应正文添加到 ApiResponse
- java - Java // 冗余
- .net - 发布请求中的 500(内部服务器错误)(.net core 2.0)