我最近对 SIMD 优化产生了兴趣,因为我想在一段时间内不再使用 C++ 编程。请描述一下,因为我仍然是 SIMD 指令的初学者。
我的问题是:是否有可能用 C++ 编译一个支持各种 SIMD 指令集并实时选择最佳指令集的跨平台可执行文件?在性能方面最好,通常最新的指令集更好。
示例:我使用 i7-7700K 在 Windows 10 上编译了一款游戏,并将其放到了 Steam 上。不同的用户很可能拥有支持不同 SIMD 指令集的不同 CPU。启动游戏时,会检测并使用最佳 SIMD 指令集。
当然,我必须调整我的代码并支持一些手动选择的 SIMD 指令集。
最佳答案
一般来说,问题在于您希望使用 SIMD 的粒度级别...D3DXMath 等较旧的数学库使用间接跳转(即虚拟方法)在运行时选择针对该指令集优化的函数版本。虽然这在理论上可行,但该函数必须做足够的工作来弥补间接调用的开销。
例如:如果您调用 D3DXVec3Dot
并且它为 SSE/SSE2、SSE3 或 SSE4.1 选择不同的版本,最有可能首先调用该函数的成本比性能节省。要真正从这种优化中获益,您需要有更大规模的例程来一次执行数千次计算,而不是微函数。
Note that this is why DirectXMath is an all inline library that doesn't use indirect jump/dispatch at all. You can count on SSE/SSE2 always being supported for x64, and it's basically always supported for x86. If you happen to be building an EXE/DLL for a platform that always has AVX (such as Xbox One), then use
/arch:AVX
and the DirectXMath library will use AVX, SSE4.1, SSE3, SSE2/SSE where it makes sense. See this blog post series.
关于c++ - 跨平台 SIMD 调用可能只用一个可执行文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065757/