针对特定的计算机/处理器体系结构进行优化

Optimize for a specific machine / processor architecture

本文关键字:体系结构 处理器 优化 计算机      更新时间:2023-10-16

在这个关于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 代码一样快或更快。当然,以这种方式支持多种架构需要做更多的工作。