【发布时间】:2022-01-12 17:40:06
【问题描述】:
我有一个浮点数组,我想以相反的顺序访问它们。在我的非矢量化代码中,这很容易。
这是我拥有的数据的简化版本。
float A[8] = {a, b, c, d, e, f, g, h};
float B[8] = {s, t, u, v, w, x, y, z};
这是我想做的操作。
float C[8] = {a*z, b*y, c*x, d*w, e*v, f*u, g*t, h*s};
我希望能够进行某种load_ps 操作,它会给我这样的东西:
__m256 A_Loaded = _mm256_load_ps(&A[0]);
= {a, b, c, d, e, f, g, h};
__m256 B_LoadedReversed = _mm256_loadr_ps(&B[7]);
= {z, y, x, w, v, u, t, s};
__m256 Output = _mm256_mul_ps(A_Loaded, B_LoadedReversed);
= {a*z, b*y, c*x, d*w, e*v, f*u, g*t, h*s};
我拥有的一个数据源是一个查找表,因此如果迫在眉睫,可以反转,但更愿意避免这种情况,因为这会使程序的其他领域变得复杂。
我目前使用_mm256_set_ps() 并手动指向我需要的数据有一个拙劣的解决方法,但这并不像我想要的那样高效。
我知道有一个“颠倒的”_mm256_set_ps() (_mm256_setr_ps()),但似乎没有我需要的 _mm256_loadr_ps()。
任何关于这个问题的想法和想法将不胜感激!提前致谢。
【问题讨论】:
-
我从未使用过这些内在函数,但我尝试在使用
-mavx编译并查看assembly code 时手动执行此操作,它看起来还不错.我不知道在使用内部函数时它与汇编代码相比如何。 -
@Ted,在这种情况下,相反的是无操作。您在局部变量中全为零,因此编译器完全传播了常量并将其全部替换为
xorps。如果将浮点数从 main 移到 global,您会看到编译器发出代码,并且它不像 shuffle 那样最佳。 -
@Ted,奇怪的事实:在 MSVC STL 中,有一个优化可以显式实现
std::reverse用于具有 SSE2/AVX2 shuffle 的琐碎类型,这里是 4 字节类型版本:github.com/microsoft/STL/blob/main/stl/src/… 所以不要依赖编译器,库方面有明确的帮助。 -
@AlexGuteniev 我明白了,谢谢!我没有自己尝试的工具包。看起来不错。哦,还有很酷的 MS 优化。
-
术语:例如,“表演”是指你在舞台上作为演员。您正在寻找“高性能”。
标签: c++ c x86-64 intrinsics avx