【问题标题】:Fastest way to shift 32 bits right on a __m128 (Intel Intrinsics)在 __m128 上向右移动 32 位的最快方法(英特尔内部)
【发布时间】:2013-11-05 06:45:45
【问题描述】:

我有一个 128 位变量,其中填充了 4 个单独的整数。 [1,2,3,4]。我想右移,所以我可以得到 [2,3,4,0]。最快的方法是什么。

我当前的代码:

__m128 v1;
v1 = (__m128)_mm_srli_si128(  _mm_castps_si128(v1) , 4 );

这成功地转移了位,但我正在尝试进行速度和缓存优化(也就是尽可能少的变量)。有没有办法改进这段代码以避免在 __m128i 之间进行转换?

谢谢

【问题讨论】:

  • 您可能没有意识到,但您当前的方法只需要 1 个寄存器。但是,您会遇到 int fp transfer latencies。

标签: c caching optimization intel intrinsics


【解决方案1】:

别担心。 __m128__m128i 是解释 XMM 寄存器内容的两种不同方式,因此转换在编译中消失了。我的编译器(Mac OS 10.9 上的 clang)将整个东西编译成一条指令:

psrldq $0x4, %xmm0

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 2010-11-19
    • 2012-02-25
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多