针对特定的计算机/处理器体系结构进行优化
Optimize for a specific machine / processor architecture
在这个关于C++和Java之间性能差异的问题的高度投票回答中,我了解到JIT编译器有时能够更好地优化,因为它可以确定机器的确切细节(处理器,缓存大小等):
通常,C#和Java可以同样快或更快,因为JIT 编译器 -- 在 IL 首次编译时编译 IL 的编译器 执行 -- 可以进行C++编译程序无法进行的优化 因为它可以查询机器。它可以确定机器是否 英特尔或AMD;奔腾 4、核心独奏或核心二重奏;或者如果支持 SSE4, 等。
一个C++程序必须事先编译,通常混合 优化使其在所有机器上运行良好,但 没有针对单个配置进行优化(即 处理器、指令集、其他硬件)。
问:有没有办法告诉编译器专门针对我当前的机器进行优化?有没有能够做到这一点的编译器?
对于 GCC,您可以使用标志-march=native
。请注意,生成的代码可能无法在其他 CPU 上运行,因为
GCC 使用此名称来确定它可以发出哪种指令 生成汇编代码时。
因此可以生成特定于 CPU 的程序集。
如果您希望代码在其他 CPU 类型上运行,但对其进行调整以获得更好的 CPU 性能,则应使用-mtune=native
:
指定要调整其性能的处理器的名称。 这 代码将像目标处理器的类型一样进行调整 在此选项中指定,但仍使用与 由 -MCPU= 选项指定的目标处理器。
当然,可以指示编译器针对特定体系结构进行优化。gcc 也是如此,如果你看看你可以传入的众多架构标志。在Visual Studio上也是如此,因为它有-MACHINE选项和/arch选项。
但是,与 Java 不同,这可能意味着生成的代码只能(安全)在目标硬件上运行。Java可以同样快或更快的说法只有在通用编译的C++代码的情况下才可能成立。给定目标体系结构,为该特定体系结构编译C++代码可能与等效的 Java 代码一样快或更快。当然,以这种方式支持多种架构需要做更多的工作。
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 未使用的 asm() 在不受支持的体系结构上的行为
- 用于本地网络运行的客户端服务器体系结构
- 生成文件:体系结构x86_64的未定义符号
- Xcode"体系结构x86_64的未定义符号"
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 体系结构x86_64的未定义符号:找不到原因
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 以编程方式在运行时检测 CPU 体系结构
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 针对特定的计算机/处理器体系结构进行优化
- 警告MSB3270:项目的处理器体系结构之间的不匹配
- 使用c++以及x86和x64体系结构访问处理器中断