c++ - 跨平台 SIMD 调用可能只用一个可执行文件吗?

标签 c++ x86 sse simd avx

我最近对 ​​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/

相关文章:

c++ - SSE 指令健全性检查

c# - .NET 中的快速矢量数学 - 有哪些选项?

c++ - 在C中的一堆数组中找到最大值

math - 如何在程序集8086中找到位数?

assembly - 无法在 Linux NASM 中打印单个字符

c++ - 对象创建时 SSE 访问冲突崩溃

c++ - 从 float 转换为 int

c++ - 文件打开问题

c++ - istream::ignore 和 getline() 混淆

c - 在 gdb 中查看 ASCII 格式的寄存器内容