Optimization 优化、编译器及其效果

Optimization 优化、编译器及其效果,optimization,multicore,intel,Optimization,Multicore,Intel,(i) 如果一个程序针对一个CPU类(例如多核i7)进行了优化 通过编译同一平台上的代码,将提高其性能 在老一代的其他CPU上处于次优级别(例如奔腾4) ... 优化可能会对其他CPU上的性能有害 (ii)为了优化,编译器可以使用x86扩展(如SSE 4),这些扩展是 在旧的CPU中不可用。。。。那么,有没有退回到一些非扩展 基于旧CPU的例程 (iii)英特尔C++编译器比Visual C++编译器或GCC… (iv)一个真正的多核线程应用程序能否在 较旧的CPU(如奔腾III或4) 优化CP

(i) 如果一个程序针对一个CPU类(例如多核i7)进行了优化 通过编译同一平台上的代码,将提高其性能 在老一代的其他CPU上处于次优级别(例如奔腾4) ... 优化可能会对其他CPU上的性能有害

(ii)为了优化,编译器可以使用x86扩展(如SSE 4),这些扩展是 在旧的CPU中不可用。。。。那么,有没有退回到一些非扩展 基于旧CPU的例程

(iii)英特尔C++编译器比Visual C++编译器或GCC… (iv)一个真正的多核线程应用程序能否在 较旧的CPU(如奔腾III或4)

  • 优化CPU X上执行的代码可能会使CPU Y上的代码不如优化CPU Y上执行的代码那么优化,这可能是真的

  • 可能不会

  • 无法概括。您必须测试代码并得出自己的结论

  • 可能不会


  • 对于在某些条件下(选择编译器、选择CPU、选择编译的优化标志)为什么X应该比Y快的每个论点,一些聪明的SOer会找到一个反论点,对于每个例子,都是一个反例。当橡胶遇到路面时,你唯一的办法就是测试和测量。如果您想知道编译器X是否比编译器Y“更好”,请首先定义更好的含义,然后运行大量实验,然后分析结果。

    在平台上编译并不意味着优化该平台。(可能只是你问题中的措辞不好。)

    在我使用过的所有编译器中,针对平台X的优化不会影响指令集,只会影响指令集的使用方式,例如,针对i7的优化不会启用SSE2指令

    此外,在大多数情况下,优化器避免“悲观”未优化的平台,例如,在为i7进行优化时,通常不会选择i7上的一个小改进,如果这意味着对另一个常见平台的重大影响

    这还取决于指令集的性能差异——我的印象是,在过去十年中,指令集的性能已经大大降低了(但我最近没有深入研究——对于最近几代人来说可能是错误的)。还认为优化只在少数地方有显著差异。

    为说明优化器的可能选项,请考虑下列实现转换语句的方法:

    • 序列
      if(x==c)转到标签
    • 范围检查和跳转表
    • 二进制搜索
    • 综合上述因素
    “最佳”算法取决于比较的相对成本,通过固定偏移量跳转并跳转到从内存读取的地址。它们在现代平台上差别不大,但即使是很小的差别也会导致对一种或另一种实现的偏好

    I)如果您没有告诉编译器您喜欢哪种CPU类型,那么很可能它在所有CPU上都会稍微次优。另一方面,如果让编译器知道要针对特定类型的CPU进行优化,那么它在其他CPU类型上肯定是次优的

    二) 否(至少适用于英特尔和微软)。如果您告诉编译器使用SSE4编译,那么在代码中的任何位置使用SSE4都会感到安全,而无需测试。您有责任确保您的平台能够执行SSE4指令,否则您的程序将崩溃。您可能需要编译两个库并加载适当的库。为SSE4(或任何其他指令集)编译的另一种方法是使用内部函数,这些函数将在内部检查性能最佳的指令集(以少量开销为代价)。请注意,我在这里谈论的不是指令内部函数(它们是特定于指令集的),而是内部函数

    三) 这本身就是一个完全不同的讨论。它随每个版本而变化,对于不同的程序可能会有所不同。所以这里唯一的解决方案就是测试。只是一张便条;众所周知,英特尔编译器不能很好地编译以在英特尔以外的任何设备上运行(例如:内部函数可能无法识别AMD或通过CPU的指令集)

    四) 如果我们忽略了较新CPU的片上效率和明显的架构差异,那么是的,它在较旧的CPU上也可以执行。多核处理本身并不依赖于CPU类型。但性能非常依赖于机器体系结构(例如:内存带宽、NUMA、芯片到芯片总线)和多核通信的差异(例如:缓存一致性、总线锁定机制、共享缓存)。所有这些都使得在MP中比较新的和旧的CPU效率变得不可能,但我相信这不是你要问的。因此,总的来说,为较新的CPU开发的MP程序不应该使用较旧CPU的MP方面的效率较低。或者换句话说,仅仅为旧CPU调整程序的MP方面不会有多大作用。显然,您可以重写算法以更有效地使用特定的CPU(例如:共享缓存可能允许您使用在工作线程之间交换更多数据的算法,但该算法将在没有共享缓存、总线锁定和低内存延迟/带宽的系统上消亡),但它所涉及的不仅仅是MP相关的调整。

    (1)这不仅是可能的,而且几乎每一代x86处理器上都有记录。回到8088,每一代人都朝着你的方向前进。对于当前的主流应用程序和操作系统(包括Linux),较新的处理器速度较慢。32位到64位的转换没有帮助,更多的内核和更少的时钟速度使情况变得更糟。这是真的goi