c++ - 对于具有所有相同组件的 SSE vector ,是动态生成还是预先计算?

标签 c++ sse simd avx

当我需要执行一个 vector 操作,其操作数只是广播到每个组件的 float 时,我应该预先计算 __m256 还是 __m128,然后加载它当我需要它时,或者每次我需要 vector 时使用 _mm_set1_ps 将 float 广播到寄存器?

我一直在预先计算非常重要且使用频繁的 vector ,并即时生成不太重要的 vector 。但是我真的通过预计算获得了任何速度吗?值得这么麻烦吗?

_mm_set1_ps 是用一条指令实现的吗?这可能会回答我的问题。

最佳答案

我认为通常最好从代码(例如循环)中分离出 SSE vector ,并在需要时使用它,假设您注意不要不小心将其强行放入内存。 (例如,如果你获取它的地址或通过引用将它传递给另一个函数,那么它可能会被强制进入内存,你可能会得到奇怪的行为。)
这个想法是,通常最好避免将值传入和传出 SSE 寄存器,如果碰巧在您的特定情况下情况并非如此,编译器已经知道该值是如何产生的 build 并可以rematerialize如果需要的话。我认为这比 loop-invariant code motion 容易得多一般来说,这是反向优化(即编译器为您分解出来的地方)并且需要编译器证明代码确实是循环不变的。

关于c++ - 对于具有所有相同组件的 SSE vector ,是动态生成还是预先计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843345/

相关文章:

c++ - 在不同的 VBO 中存储不同的顶点属性

gcc - GCC 中向量类型 __m128、__m256 的重载冲突

sse - 两个 256 位整数的按位异或

c++ - 添加新节点后链表头始终为空

c++ - clang: error: linker command failed with exit code 1 (use -v to see invocation) *关于全局变量

performance - SSE2 : How To Load Data From Non-Contiguous Memory Locations?

c - SSE 添加字符

c++ - 如何将整数数组转换为 SIMD vector

c - 如何最好地模拟 _mm_slli_si128(128 位位移)的逻辑含义,而不是 _mm_bslli_si128

c++ - 循环内的迭代器不会递增