代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

特殊CPU特性的C/C++应用

  •  7
  • B.Gen.Jack.O.Neill  · 技术社区  · 15 年前

    我很好奇,新的编译器是否使用了一些内置在新CPU中的额外功能,比如mmx sse、3dnow!那么?

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

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

    谢谢你的回答。

    编辑:

    好的,所以,如果我让大家都正确的话,甚至一些标准操作,特别是使用浮点数,也可以更快地使用SSE完成。

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

    在某些需要最高性能的系统库(如OpenGL、DirectX等)的情况下,系统可能支持此支持。

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

    9 回复  |  直到 15 年前
        1
  •  4
  •   Brian Agnew    15 年前

    GCC将通过命令行参数支持更新的指令。见 here 更多信息。引述:

    GCC可以利用 MMX中的附加说明, SSE、SSE2、SSE3和3DNow扩展 最近的英特尔和AMD处理器。 选项-mmmx、-msse、-msse2, -MSSE3和-M3D如何启用这些额外指令,允许 要处理的多个数据字 并行地。生成的可执行文件 仅在支持的处理器上运行 适当的扩展--在其他方面 他们将要崩溃的系统 非法指令错误(或类似错误)

        2
  •  2
  •   rotoglup    15 年前

    这些指令不是任何ISC/C/C++标准的一部分。它们可以通过 编译器内部函数 ,取决于使用的编译器。

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

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

    在GCC和MSVC之间,afaik、sse内部函数是相同的。

        3
  •  1
  •   Thomas Matthews    15 年前

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

    您需要学习编译器附带的文档。

        4
  •  1
  •   Greg Hewgill    15 年前

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

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

        5
  •  1
  •   Tom Womack    15 年前

    如果您使用“英特尔C编译器”,并设置足够高的优化选项,您会发现有些循环是“矢量化的”,这意味着编译器已重写它们以使用SSE样式的指令。

    如果要直接使用SSE操作,可以使用“xmmintrin.h”头文件中定义的内部函数;比如

    #包括<xmmintrin.h>

    _ 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存储PS(WW,W);

        6
  •  0
  •   Puppy    15 年前

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

        7
  •  0
  •   Nick Meyer    15 年前

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

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

    如果你说的是C/C++写的代码,如果你告诉编译器这样做的话,新的特性就会被解释出来。默认情况下,您的编译器可能以“纯x86”(当然是使用fpu:)为目标),通常针对目前最广泛的处理器生成进行了优化,但仍然能够在较旧的处理器上运行。

    如果希望编译器生成代码也考虑新的指令集,则应该告诉它用适当的命令行切换/项目设置来执行,例如对于VisualC++,允许SSSE/SSE2指令生成的选项是 /arch .

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

        9
  •  0
  •   daveangel    15 年前

    Intel每次发布新的CPU时都会提供更新的cpuid示例代码,这样您就可以检查新功能了,而且我还记得。至少这是我第一次想到这个问题时发现的。

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

    随着新编译器的发布,它们直接添加了新的特性,例如VS2010。 Visual C++ Code Generation in Visual Studio 2010

    推荐文章