小编Wit*_*902的帖子

VPERMILPS指令的重点是什么(_mm_permute_ps)?

AVX指令集引入了VPERMILPS,它似乎是SHUFPS的简化版本(对于两个输入寄存器相同的情况).

例如,以下说明:

c5 f0 c6 c1 00          vshufps xmm0,xmm1,xmm1,0x0
Run Code Online (Sandbox Code Playgroud)

可以替换为:

c4 e3 79 04 c1 00       vpermilps xmm0,xmm1,0x0
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,VPERMILPS版本需要额外增加一个字节并执行相同的操作.根据指令表,两条指令占用1个CPU周期并具有相同的吞吐量.

引入这种指令有什么意义?我错过了什么吗?

编辑:这两个指令的区别之一.VPERMILPS将上部通道设置为零,而SHUFPS使它们不受影响.

x86 assembly instruction-set avx

11
推荐指数
1
解决办法
271
查看次数

计算8个AVX单精度浮点矢量的8个水平和

我有8个AVX向量,每个向量包含8个浮点数(总共64个浮点数),我想将每个向量中的元素加在一起(基本上执行8个水平求和).

现在,我正在使用以下代码:

__m256 HorizontalSums(__m256 v0, __m256 v1, __m256 v2, __m256 v3, __m256 v4, __m256 v5, __m256 v6, __m256 v7)
{
    // transpose
    const __m256 t0 = _mm256_unpacklo_ps(v0, v1);
    const __m256 t1 = _mm256_unpackhi_ps(v0, v1);
    const __m256 t2 = _mm256_unpacklo_ps(v2, v3);
    const __m256 t3 = _mm256_unpackhi_ps(v2, v3);
    const __m256 t4 = _mm256_unpacklo_ps(v4, v5);
    const __m256 t5 = _mm256_unpackhi_ps(v4, v5);
    const __m256 t6 = _mm256_unpacklo_ps(v6, v7);
    const __m256 t7 = _mm256_unpackhi_ps(v6, v7);

    __m256 v = _mm256_shuffle_ps(t0, t2, 0x4E);
    const __m256 tt0 = …
Run Code Online (Sandbox Code Playgroud)

optimization low-level intrinsics avx

8
推荐指数
1
解决办法
206
查看次数