【问题标题】:Mult plus shift left ops using MMX assembler instructions使用 MMX 汇编器指令的乘法加左移操作
【发布时间】:2011-10-14 13:30:36
【问题描述】:

我正在寻找进行shl(mult(var1,var2),1) 运算,其中multvar1var2 相乘(两者都是16 位有符号整数)并且shl 以算术方式将乘法结果左移。结果必须是饱和的,即 int32 max 或 int32 min 如果发生上溢或下溢和mult(-32768,-32768)=2147483647

我需要以一种我认为使用 MMX/SSE 指令集的有效方式对多个值进行此操作。我虽然想制作mult(sign_extesion(var1)shl(sign_extension(var2))),但我刚刚发现不存在 MMX mult() 饱和版本。你知道其他的获取方式吗?

【问题讨论】:

    标签: assembly x86 sse mmx saturation-arithmetic


    【解决方案1】:

    我认为以下内容应该适合您。只有一个潜在的溢出案例 (SHRT_MIN * SHRT_MIN),它会明确处理:

    #include <limits.h>
    #include <mmintrin.h>
    
    int main(void)
    {        
        __m64 v1 = _mm_set_pi16(0, SHRT_MAX, 0, SHRT_MIN);
        __m64 v2 = _mm_set_pi16(0, SHRT_MIN, 0, SHRT_MIN);
        __m64 v = _mm_madd_pi16(v1, v2); // 16 x 16 signed multiply
        v = _mm_slli_pi32(v, 1);         // shift left by 1 bit to get full range
        __m64 vcmp = _mm_cmpeq_pi32(v, _mm_set1_pi32(INT_MIN));
                                         // test for SHRT_MIN * SHRT_MIN overflow
        v = _mm_add_pi32(v, vcmp);       // and correct if needed
    
        return 0;
    }
    

    【讨论】:

    • 你有经验通过 MMX insead 单次乘法可以获得多少增益?
    • @LooPer:这取决于 CPU,但大多数当前的 Intel CPU 都有两个整数 ALU,因此从像这样的 2 路 SIMD 中可能没有太多好处。如果您可以使用 128 位 SSE,那么您应该会看到显着的性能提升,前提是您不受内存带宽限制。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2011-04-02
    • 2019-04-04
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多