【问题标题】:Cross-platform SIMD calls possible with only one executable?跨平台 SIMD 调用可能只需要一个可执行文件?
【发布时间】:2018-06-27 14:47:28
【问题描述】:

我最近对 ​​SIMD 优化产生了兴趣,因为在一段时间没有这样做之后,我想再次使用 C++ 进行编程。请进行描述,因为我还是 SIMD 指令的初学者。

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

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

当然,我必须调整我的代码并支持一些手动选择的 SIMD 指令集。

【问题讨论】:

标签: c++ x86 sse simd avx


【解决方案1】:

一般来说,问题是您希望使用 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

【讨论】:

  • 哦,好吧,所以它是动态可行的。也谢谢你的链接!你的帖子给了我一些其他问题的灵感。
猜你喜欢
  • 2017-11-08
  • 2021-10-24
  • 2011-06-12
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2015-09-13
  • 2011-02-09
相关资源
最近更新 更多