代码之家  ›  专栏  ›  技术社区  ›  Benoît Dubreuil

只有一个可执行文件就可以进行跨平台simd调用?

  •  0
  • Benoît Dubreuil  · 技术社区  · 8 年前

    最近,我对simd优化产生了兴趣,因为我想在不这样做一段时间后再次用c++编程。请描述一下,因为我还是一个使用simd指令的初学者。

    我的问题是:是否可以用c++编译一个跨平台的可执行文件,它支持各种simd指令集,并实时选择要使用的最佳指令集?在性能方面最好,通常最新的指令集更好。

    我在windows 10上用i7-7700k编译了一个游戏,然后把它放到steam上。不同的用户很可能有不同的CPU,支持不同的SIMD指令集。启动游戏时,会检测并使用最佳simd指令集。

    当然,我必须修改我的代码并支持一些手工选择的simd指令集。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Chuck Walbourn    8 年前

    一般来说,问题是您希望使用simd的粒度级别…像d3dxmath这样的旧数学库使用间接跳转(即虚拟方法)在运行时选择为该指令集优化的函数版本。虽然这在理论上可行,但函数必须做足够的工作来覆盖间接调用的开销。

    例如:如果你打电话给 D3DXVec3Dot 它为sse/sse2、sse3或sse4.1选择了不同的版本,很可能首先调用该函数的成本比性能节省的成本更高。要真正从这种优化中获益,您需要有更大规模的例程来同时执行数千次计算,而不是使用微函数。

    注意这就是为什么 DirectXMath 是一个完全不使用间接跳转/分派的内联库。您可以指望SSE/SSE2始终支持x64,而它基本上始终支持x86。如果您碰巧正在为一个总是有avx的平台(如xbox one)构建一个exe/dll,那么使用 /arch:AVX directxmath库将在有意义的地方使用avx、sse4.1、sse3、sse2/sse。见 this blog post series 是的。

    推荐文章