只有一个可执行文件即可进行跨平台 SIMD 调用?
Cross-platform SIMD calls possible with only one executable?
我最近对 SIMD 优化产生了兴趣,因为我想在一段时间没有编程后再次在 C++ 中编程。请描述一下,因为我仍然是 SIMD 说明的初学者。
我的问题是:是否可以在C++中编译一个支持各种 SIMD 指令集并实时选择最佳指令集的跨平台可执行文件?在性能方面最好,通常最新的指令集更好。
示例:我在Windows 10上用i7-7700K编译一个游戏,并将其放在Steam上。不同的用户很可能具有支持不同 SIMD 指令集的不同 CPU。启动游戏时,会检测并使用最佳 SIMD 指令集。
当然,我必须调整我的代码并支持一些手工选择的 SIMD 指令集。
通常,问题是您希望使用 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。请参阅此博客文章系列。
- 通过网络、跨平台传递std::变体是否安全
- 如何跨平台将二进制资源构建到程序中?
- 在 C++ 中使用 SIMD 向量的矩阵乘法
- 以跨平台的方式将图像源路径从C++发送到 QML
- 跨平台 GPU 计算
- 在哪里存储跨平台C++应用存储?
- 如何将外部依赖引入跨平台CMake项目?
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 将 VS Code 用于跨平台可缩放C++项目
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- 使用通配符的跨平台文件列表
- 关于连续迭代器的 SIMD 指令
- 为什么 C++ 标准库中没有 SIMD 功能?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 如何使用跨平台代码在C++中设置系统时间?
- 跨平台 c++ 和 Visual Studio 2017?
- 跨平台随机重现性
- c++中的交叉编译(作为跨平台应用程序的一部分或作为服务)
- 只有一个可执行文件即可进行跨平台 SIMD 调用?