SSE跨平台说明集

时间:2019-02-26 05:45:19

标签: c++ assembly sse

我想在VS2017中使用SSE指令编写数学函数。我可以尝试:

__m128 addWithIntrinsics(__m128 a, __m128 b)
{
    __m128 r = _mm_add_ps(a, b);
    return r;
}

__m128 addWithAssembly(__m128 a, __m128 b)
{
    __m128 r;
    __asm
    {
        movaps xmm0, xmmword ptr[a]
        movaps xmm1, xmmword ptr[b]
        addps xmm0, xmm1
        movaps xmmword ptr[r], xmm0
    }
    return r.
}

但是我不确定...如果我编写这样的数学运算,那么该代码是否可以跨平台使用(就只能在Windows上运行,而在不同的处理器上以及不支持SSE的处理器上而言),或者我是否需要在编译阶段确定处理器是否遵循了这些指令,如果没有,则使用通常的指令?对我来说,最好的方法是什么?两个变体中的哪个更可取?

1 个答案:

答案 0 :(得分:2)

如果您希望能够在不带SSE的处理器上运行,则需要编写两个版本(带和不带)。您需要check at runtime是否正在运行的当前计算机支持SSE,并根据结果使用适当的功能。

至于哪个更好–这是一个品味问题。我更喜欢用C ++编程,所以我更喜欢内部函数版本。但是,如果您与大量的汇编程序员一起工作,他们可能会更喜欢汇编版本。