仅使用一个可执行文件就可以进行跨平台SIMD调用吗?

时间:2018-06-27 14:47:29

标签: c++ x86 sse simd avx

最近一段时间,我想重新用C ++编程后,对SIMD优化产生了兴趣。请描述一下,因为我仍然是SIMD说明的初学者。

我的问题是:是否可以在C ++中编译一个跨平台的可执行文件,该可执行文件支持各种SIMD指令集并实时选择要使用的最佳指令集?就性能而言最好,通常最新的指令集会更好。

示例:我在Windows 10上使用i7-7700K编译游戏并将其放在Steam上。不同的用户很可能具有支持不同SIMD指令集的不同CPU。启动游戏时,将检测并使用最佳的SIMD指令集。

自然,我将不得不修改我的代码并支持一些手动选择的SIMD指令集。

1 个答案:

答案 0 :(得分:2)

通常的问题是您要使用SIMD的粒度级别如何?D3DXMath等较旧的数学库使用间接跳转(即虚拟方法)在运行时选择针对该指令集优化的函数版本。尽管从理论上讲这是可行的,但该函数必须做足够的工作来覆盖间接调用的开销。

例如:如果调用D3DXVec3Dot,并且它为SSE ​​/ SSE2,SSE3或SSE4.1选择了不同的版本,则最先调用该函数的成本可能比性能节省的成本高。 。为了真正从这种优化中受益,您需要拥有较大规模的例程,该例程可以一次执行数千次计算,而不是微函数。

  

请注意,这就是DirectXMath是一个完全不使用间接跳转/分派的全内联库的原因。您可以指望x64始终支持SSE / SSE2,而x86基本上始终支持它。如果您恰好为始终具有AVX的平台(例如Xbox One)构建EXE / DLL,则使用/arch:AVX,DirectXMath库将在其中使用AVX,SSE4.1,SSE3,SSE2 / SSE说得通。参见this blog post series