![]() |
1
4
GCC将通过命令行参数支持更新的指令。见 here 更多信息。引述:
|
![]() |
2
2
这些指令不是任何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
编译器的目标是为处理器中的最小功能集生成代码。它们还提供编译开关,允许您以特定处理器为目标。通过这种方式,他们可以销售更多的编译器(卖给那些使用旧处理器的人,以及那些使用新处理器的时髦的人)。 您需要学习编译器附带的文档。 |
![]() |
4
1
有时运行时库将包含一个特性的多个实现,当程序运行时,库将在实现之间动态选择。开销可能是函数指针调用的成本,而不是直接的函数调用,但是当使用特定于CPU的优化函数时,好处可能会更大。 JIT编译器(对于VM语言,如Java和C.*)进行了这一步,并编译了字节码。 具体的 它运行的CPU。这使您自己的代码受益于特定的CPU优化。这就是Java代码实际上可以使用的原因之一。 更快 而不是编译的C代码,因为JavaJIT编译器可以延迟其优化决策,直到程序在实际的目标机器上运行。C编译器必须在不知道目标CPU是什么的情况下做出这些决定。此外,JIT编译器不断发展,可以让您的程序随着时间的推移变得更快,而无需做任何事情。 |
![]() |
5
1
如果您使用“英特尔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
不同的编译器将使用不同的新功能。Visual Studio将使用SSE/2,我相信英特尔编译器将支持最新的CPU功能。当然,你应该对你最喜欢的功能的市场渗透保持警惕。
|
![]() |
7
0
编译器通常有两种方法可以生成使用如下特殊功能的代码:
|
![]() |
8
0
如果你说的是C/C++写的代码,如果你告诉编译器这样做的话,新的特性就会被解释出来。默认情况下,您的编译器可能以“纯x86”(当然是使用fpu:)为目标),通常针对目前最广泛的处理器生成进行了优化,但仍然能够在较旧的处理器上运行。 如果希望编译器生成代码也考虑新的指令集,则应该告诉它用适当的命令行切换/项目设置来执行,例如对于VisualC++,允许SSSE/SSE2指令生成的选项是 /arch . 注意,新指令集的许多特性不能在“普通”代码中直接利用,因此通常会向您提供编译器内部函数,以便在新指令集的特定数据类型上操作。 |
![]() |
9
0
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 |