我很好奇,执新编译器使用一些额外的功能建成新的Cpu如试试吧SSE,3DNow!所以?

我的意思是,在原来的8086甚至还有没有FPU,因此编译器,旧甚至不能使用它,但新编译器的可能,因为FPU一部分的每一个新的CPU。因此,新编译器使用新功能的CPU?

或者,应该更多的权利要求,新C/C++斯坦达库功能,使用新特点?

谢谢你的回答。

编辑:

好吧,那么,如果我得到你们所有的权利,甚至一些标准操作,尤其是与浮动数量可以通过使用上证速度更快。

为了要使用它,我必须使这种功能在我的编译器,如果它支持它。如果是这样,我必须确保有针对性的平台,支持这一特征。

在某些情况下系统图书馆,需要最佳性能,例如照片,可因此,这种支持可以支持系统。

默认情况下,兼容性原因,编译器击支持它,但是你可以添加这种支持使用特殊C功能的交付,例如英特尔。这应该是最好的方式,因为你可以直接控制天气和当使用特殊的特点所需的平台,编写多CPU的支持应用程序。

有帮助吗?

解决方案

GCC将支持通过命令行参数较新的指令。请参见这里更多信息。引用:

  

GCC可以利用的   在MMX额外的指令,   SSE,SSE2,SSE3和3DNow扩展   最近Intel和AMD处理器。   选项-mmmx,-msse,-msse2,   -msse3和-m3dnow能够使用这些额外的指令,使   多个字的数据要被处理   在平行下。生成的可执行文件   仅在处理器,支持运行   适当的扩展 - 其他   他们将与系统崩溃   非法指令错误(或类似)

其他提示

这些指令不是任何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,SSE内在是GCC和MSVC之间相同。

编译器将瞄准用于在处理器中的一组特征的最小生产代码。他们还提供了编译开关,使您能够针对特定的处理器。通过这种方式,他们可以出售更多的编译器(与旧的处理器,以及与新的时尚民歌那些人)。

您将需要学习的是与你的编译器附带的文档。

有时运行时库将包含一个功能的多个实现,并且当程序运行时库动态地将实现之间进行选择。的开销可能是一个函数指针呼叫,而不是直接函数呼叫的成本,而且使用CPU专用优化功能时的益处可以是大得多。

JIT编译器(用于VM的语言,如Java和C#)还借此一个步骤和编译的特定 CPU,它的其上运行的字节码。这使你自己的代码的特定CPU优化的好处。这就是为什么Java代码其实是可以的更快的比编译的C代码,因为直到程序的实际目标机器上运行Java JIT编译器可延缓其优化决策。 A C编译器必须始终不知道目标的CPU是什么使这些决定。此外,JIT编译进化,可以使你的程序在时间快,您无需做任何事情。

如果您使用Intel C编译器,并设置足够高的优化选项,你会发现,你的一些循环得到“矢量化”,这意味着编译器重写他们使用SSE风格的指令。

如果要直接使用SSE操作,可以使用在“xmmintrin.h”标题文件中定义的内在;比方说

的#include

__ M128 U,V,W; 浮子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);

变的编译器将使用变化的新功能。 Visual Studio将使用SSE / 2,我相信英特尔编译器将支持CPU功能方面的信息。你应该,当然,警惕你最喜欢的功能的市场渗透力。点击 至于什么你最喜欢的标准库使用,这取决于它是什么编译。然而,C ++标准库通常编译现场,因为它是非常沉重模板,因此,如果您启用SSE2,在C ++的std库应该使用它。对于CRT,取决于什么它们用编译。

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

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

如果你谈论的是写在C / C ++代码,新的功能,如果你告诉你的编译器这样做explited。默认情况下,你的编译器可能是针对“普通的x86”(自然与FPU :)),通常是在目前最广泛的一代处理器进行了优化,但仍可以在旧的处理器上运行。

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

请注意,新的指令集许多特征不能直接在“正常”的代码利用,所以你通常设置有编译器本征到原生新的指令集的具体数据类型进行操作。

英特尔提供了更新的CPUID例码每次他们释放一个新的cpu所以,你可以检查新的功能,并已为长作为我记得。至少这是我发现我第一次想过这个同样的问题我自己。

使用CPUID,以检测是否存在证4.1和SSE4.2指令集

作为新编译器被释放他们增加新的功能直接VS2010的例子。视觉C++代码生成在Visual Studio2010年

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top