7

我很好奇,新编译器是否使用新 CPU 中内置的一些额外功能,例如 MMX SSE、3DNow!所以?

我的意思是,在最初的 8086 中甚至没有 FPU,所以旧的编译器甚至不能使用它,但是新的编译器可以,因为 FPU 是每个新 CPU 的一部分。那么,新的编译器是否使用了 CPU 的新特性?

或者,更应该问的是,新的 C/C++ 标准库函数是否使用了新特性?

感谢您的回答。

编辑:

好的,所以,如果我让你们所有人都说对了,即使是一些标准操作,尤其是浮点数,也可以使用 SSE 更快地完成。

为了使用它,我必须在我的编译器中启用这个特性,如果它支持的话。如果是这样,我必须确保目标平台支持该功能。

对于某些需要顶级性能的系统库,如OpenGL、DirectX等,系统可能会支持这种支持。

默认情况下,出于兼容性原因,编译器不支持它,但您可以使用 Intel 等提供的特殊 C 函数添加此支持。这应该是最好的方式,因为您可以直接控制天气,当您使用所需平台的特殊功能时,可以编写支持多 CPU 的应用程序。

4

9 回答 9

4

gcc 将通过命令行参数支持更新的指令。请参阅此处了解更多信息。去引用:

GCC 可以利用最新 Intel 和 AMD 处理器的 MMX、SSE、SSE2、SSE3 和 3dnow 扩展中的附加指令。选项 -mmmx、-msse、-msse2、-msse3 和 -m3dnow 启用这些额外指令,允许并行处理多个数据字。生成的可执行文件将仅在支持适当扩展的处理器上运行——在其他系统上,它们将因非法指令错误(或类似错误)而崩溃

于 2010-05-17T21:43:17.797 回答
2

这些说明不属于任何 ISO C/C++ 标准。它们可通过编译器内在函数获得,具体取决于使用的编译器。

对于 MSVC,请参阅http://msdn.microsoft.com/en-us/library/26td21ds(VS.80).aspx

对于 GCC,您可以查看http://developer.apple.com/hardwaredrivers/ve/sse.html

AFAIK,GCC 和 MSVC 之间的 SSE 内在函数是相同的。

于 2010-05-17T21:46:33.303 回答
1

编译器的目标是为处理器中的最小功能集生成代码。它们还提供编译开关,允许您以特定处理器为目标。通过这种方式,他们可以销售更多的编译器(给那些拥有旧处理器的人以及拥有新处理器的时髦人)。

您将需要研究编译器附带的文档。

于 2010-05-17T21:43:54.213 回答
1

有时运行时库会包含一个特性的多个实现,并且库会在程序运行时在实现之间动态选择。开销可能是函数指针调用而不是直接函数调用的成本,但使用特定于 CPU 的优化函数时好处可能更大。

JIT 编译器(用于 Java 和 C# 等 VM 语言)更进一步,为运行它的特定CPU 编译字节码。这使您自己的代码受益于特定的 CPU 优化。这就是 Java 代码实际上比编译后的 C 代码更快的原因之一因为 Java JIT 编译器可以延迟其优化决策,直到程序在实际目标机器上运行。AC 编译器必须在不知道目标 CPU 是什么的情况下做出这些决定。此外,JIT 编译器不断发展,可以让您的程序随着时间的推移变得更快,而无需您做任何事情。

于 2010-05-17T21:46:50.203 回答
1

If you use the Intel C compiler, and set sufficiently high optimisation options, you will find that some of your loops get 'vectorised', which means the compiler has rewritten them to use SSE-style instructions.

If you want to use SSE operations directly, you use the intrinsics defined in the 'xmmintrin.h' header file; say

#include <xmmintrin.h>

__m128 U, V, W; float ww[4];

V=_mm_set1_ps(1.5);

U=_mm_set_ps(0,1,2,3);

W=_mm_add_ps(U,V);

_mm_storeu_ps(ww,W);

于 2010-05-17T21:55:07.167 回答
0

不同的编译器将使用不同的新特性。Visual Studio 将使用 SSE/2,我相信英特尔编译器将支持最新的 CPU 功能。当然,您应该警惕您最喜欢的功能的市场渗透率。
至于你最喜欢的标准库使用什么,这取决于它是用什么编译的。但是,C++ 标准库通常是在现场编译的,因为它的模板化程度很高,所以如果启用 SSE2,C++ 标准库应该使用它。至于 CRT,取决于它们是用什么编译的。

于 2010-05-17T21:44:14.057 回答
0

编译器通常有两种方法可以生成使用这些特殊功能的代码:

  1. 当编译器本身被编译时,您将其配置为为特定架构生成代码,并且它可以利用它知道该架构将具有的任何功能。例如,如果它gcc被配置为一个足够新的英特尔处理器(或者“不够老”?)以包含一个集成的 FPU,它将生成浮点指令。
  2. 当编译器被调用时,标志或参数可以指定运行程序的处理器可用的特性类型,然后编译器就会知道使用这些特性是安全的。如果标志不存在,它将生成等效代码,而无需使用这些功能提供的特殊指令。
于 2010-05-17T21:46:15.380 回答
0

如果您谈论的是用 C/C++ 编写的代码,那么如果您告诉编译器这样做,新功能就会被开发出来。默认情况下,您的编译器可能针对“plain x86”(自然使用 FPU :)),通常针对目前最广泛的处理器一代进行优化,但仍然能够在较旧的处理器上运行。

如果您希望编译器在考虑新指令集的同时生成代码,您应该使用适当的命令行开关/项目设置告诉它这样做,例如对于 Visual C++,启用 SSE/SSE2 指令生成的选项是/arch

请注意,新指令集的许多特性不能在“正常”代码中直接利用,因此通常会为您提供编译器内在函数,以便对新指令集的特定数据类型进行操作。

于 2010-05-17T21:48:48.670 回答
0

Intel provides updated CPUID example code every time they release a new cpu so that you can check for the new features and has been as long as I remember. At least this is what I found the first time I thought about this same question myself.

Using CPUID to Detect the presence of SSE 4.1 and SSE 4.2 Instruction Sets

As new compilers are released they add the new features directly like VS2010 for example. Visual C++ Code Generation in Visual Studio 2010

于 2010-05-17T22:31:14.633 回答