SSE跨平台指令集
SSE set of instructions for crossplatform
我想在 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),或者我是否需要在编译阶段确定处理器是否使用这些指令,如果不支持则使用通常的指令?执行此操作的最佳方法是什么?我的两种变体中哪一种更可取?
如果您希望能够在没有 SSE 的处理器上 运行,您需要编写两个版本——有和没有。您需要 check at runtime 您 运行 正在使用的当前机器是否支持 SSE 并根据结果使用适当的功能。
至于哪个更好——那是一个品味问题。我更喜欢用 C++ 编程,所以我更喜欢内在函数版本。但是如果你和一群汇编程序员一起工作,他们可能更喜欢汇编版本。
我想在 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),或者我是否需要在编译阶段确定处理器是否使用这些指令,如果不支持则使用通常的指令?执行此操作的最佳方法是什么?我的两种变体中哪一种更可取?
如果您希望能够在没有 SSE 的处理器上 运行,您需要编写两个版本——有和没有。您需要 check at runtime 您 运行 正在使用的当前机器是否支持 SSE 并根据结果使用适当的功能。
至于哪个更好——那是一个品味问题。我更喜欢用 C++ 编程,所以我更喜欢内在函数版本。但是如果你和一群汇编程序员一起工作,他们可能更喜欢汇编版本。