c - 如何访问 256 位 ps vector 的组件

标签 c sse intrinsics avx

如何高效访问256位 vector 的元素?例如,我用

计算了点积
c = _mm256_dp_ps(a, b, 0xff);

那么如何访问c中的值呢?我需要同时获得高位部分和低位部分,我是否正确理解我首先需要像这样提取 128 位部分:

r0 = _mm256_extractf128_ps(c,0);
r1 = _mm256_extractf128_ps(c,1);

然后才提取 float :

_MM_EXTRACT_FLOAT(fr0, r0, 0);
_MM_EXTRACT_FLOAT(fr1, r1, 0);

return fr0 + fr1;

最佳答案

好吧,您可以只存储到内存中,然后使用标量:

float v[8];
*(__m256)(v) = _mm256_dp_ps(a, b, 0xff);
float result = v[0] + v[4];

您还可以交换 256 位寄存器的上半部分和下半部分并添加,如下所示:

__m256 c = _mm256_dp_ps(a, b, 0xff);
__m256 d = _mm256_permute2f128_ps(c, c, 1);
__m256 result = _mm256_add_ps(c, d);

一次执行 4x 8 宽点积并将它们一起归约可能比任何一个选项都快得多。草图:

d0 = _mm256_dp_ps(a[0], b[0], 0xff);
d1 = _mm256_dp_ps(a[1], b[1], 0xff);
d2 = _mm256_dp_ps(a[2], b[2], 0xff);
d3 = _mm256_dp_ps(a[3], b[3], 0xff);

d01 = _mm256_permute_ps(d0, d1, ...);
d23 = _mm256_permute_ps(d2, d3, ...);
d0123 = _mm256_permute_ps(d01, d23, ...);

d0123upper = _mm256_permute2f128_ps(d0123, d0123, 1);
d = _mm256_add_ps(d0123upper, d0123); // lower 128 bits contain the results of 4 8-wide dot products

关于c - 如何访问 256 位 ps vector 的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000316/

相关文章:

c++ - SSE,行主要与列主要性能问题

c++ - 为什么 GCC 在我的机器上创建额外的汇编指令?

c - 使用指针引用时的 block 级变量范围和生命线

python - 为 Windows 编译 unix make 文件

c - C 中 __m128 的段错误

c++ - 对于单精度矩阵运算,AVX 与 SSE 的 Eigen 性能没有差异?

C 函数刷新所有包含数组的缓存行

asp.net-mvc-2 - 如何在 asp.net mvc 2 中使用 fakeiteasy 伪造用户登录以进行单元测试

c - 全局变量默认是extern吗?如果是,那么为什么它们的默认值是 "0 "?

c - 回溯所有答案