代码之家  ›  专栏  ›  技术社区  ›  Gabriele Giuseppini

如何用libsimdpp复制XMM寄存器的通道下部

  •  2
  • Gabriele Giuseppini  · 技术社区  · 6 年前

    libsimdpp 编写矢量化代码。似乎我找不到一种方法来从内存或从一个寄存器移到另一个寄存器,移动的车道比所有车道都少。

    例如,使用 _mm_move_sd 或者_ mm_move_ss movsd movss

    如何对libsimdpp执行相同的操作?

    1 回复  |  直到 6 年前
        1
  •  1
  •   wim    6 年前

    我不熟悉libsimdpp库,但据我所知,您可以使用它 simdpp::shuffle2x2 ,具有合适的排列索引,作为 _mm_move_sd https://github.com/p12tic/libsimdpp/blob/master/simdpp/detail/insn/shuffle2x2.h ,我们可以这样看 _mm_shuffle_pd _mm_blend_pd 根据选择的排列索引使用。这些英特尔内部函数可以作为 .

    manual page 似乎你必须选择排列指数 s0 = 2 ,和 s1 = 1 _移动 . 这与 第156和157行 shuffle2x2.h ,即: if (s0 == 2 && s1 == 1) {return _mm_blend_pd(b.native(), a.native(), 0x2);}


    另一种选择 _mm_move_ss _mm_blend_ps ,戴上合适的面罩。与 simdpp::shuffle4x2 libsimdpp库选择 在x86体系结构上,如果置换索引满足以下条件 (s0==0 || s0==4) && (s1==1 || s1==5) && (s2==2 || s2==6) && (s3==3 || s3==7) ,请参见 sse_float32_4x2.h ,第40行和第155行。

    _mm_blend_ps(a, b, 1) _移动 movss 说明。看到了吗 this Godbolt link . 因此,使用libsimdpp和智能编译器,确实可以生成 操作码。 但请注意 _mm_blend_pd(a, b, 1); _mm_blend_pd(a, b, 2); ,由libsimdpp生成。

    blendpd/ps 带寄存器操作数的指令比带寄存器操作数的指令具有更好的吞吐量 movsd/ss ,自Intel Haswell处理器以来的Intel CPU上,正如Peter Cordes在其评论中所说的那样。