为什么这个cpu运行得更快?

为什么这个cpu运行得更快?,c,linux,gcc,cpu,C,Linux,Gcc,Cpu,我写了一个c程序,运行在Intel i5-7500(kubuntu和virtualbox在win10下运行)和Intel Xeon E5-26xx v4(tenxun cloud)上。我认为Intel i5-7500会更快(CPU MHz:3.4GHz),但Intel Xeon E5-26xx v4(CPU MHz:2.4GHz)实际上更快。有人能告诉我原因吗 #include <stdio.h> int main(int argc, const char *argv[]) {

我写了一个c程序,运行在Intel i5-7500(kubuntu和virtualbox在win10下运行)和Intel Xeon E5-26xx v4(tenxun cloud)上。我认为Intel i5-7500会更快(CPU MHz:3.4GHz),但Intel Xeon E5-26xx v4(CPU MHz:2.4GHz)实际上更快。有人能告诉我原因吗

#include <stdio.h>

int main(int argc, const char *argv[]) {
    long long s = 0, i = 0;
    for (i = 0; i < 12345678900; i++) {
        s += i;
    }
    printf("%lld\n", s);
    return 0;
}
结果是

➜  ~ gcc -std=c11 a.c -O2 && time ./a.out
2420917449941559086
./a.out  4.81s user 0.00s system 99% cpu 4.849 total
➜  ~ gcc -std=c11 a.c -O2 && time ./a.out
2420917449941559086
./a.out  7.01s user 0.00s system 99% cpu 7.019 total
英特尔(R)核心(TM)i5-7500 CPU@3.40GHz环境:

➜  ~ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
结果是

➜  ~ gcc -std=c11 a.c -O2 && time ./a.out
2420917449941559086
./a.out  4.81s user 0.00s system 99% cpu 4.849 total
➜  ~ gcc -std=c11 a.c -O2 && time ./a.out
2420917449941559086
./a.out  7.01s user 0.00s system 99% cpu 7.019 total

这种代码在核心i5-7500上应该运行得更快,每次迭代一个时钟周期,并且在单核turbo模式下运行。在3.8 GHz下,预期运行时间约为3.25秒

除非CPU在处理如此短的循环时出现问题(我对此表示怀疑),否则在您的情况下,可能是Windows和Virtualbox开销的组合降低了速度。电源管理配置不正确可能是另一个原因


编辑我发现一个系统具有第7代Core i5 CPU(尽管略有不同),在裸机上,它以每次迭代一个周期运行循环。

这里的主要问题是,您正在现有操作系统之上的云和虚拟化上运行。您没有看到预期结果的原因有多种:

在云上,您无法控制虚拟机如何共享物理资源(即服务器节点)。云提供商大量利用负载平衡和整合,这会导致显著的性能变化。如果你重复你的实验,我猜你会看到在性能上有很大的变化,这会使你的结果明显地扭曲

在您的虚拟设置上,您实际上没有提供有关VM配置的任何详细信息。在VM层运行会增加大量内存使用和延迟开销

考虑到您提供的细节,这些实验并不具有可比性。在不同的操作系统上运行相同的代码也会带来另一种程度的不可预测性。电源/热量管理和调度策略在Windows和Linux之间可能有很大不同。即使在同一个操作系统中,也有许多控制旋钮足以产生错误的测量

如果您想比较两种不同的处理器,以下是有关如何设计实验的一些指导原则:

  • 由于您试图测量处理器的性能影响,而不是系统中的任何其他组件,因此实验中唯一的变量应该是处理器类型。也就是说,使用相同的操作系统、相同的操作环境、相同的电源/热控制策略、相同的内存容量和速度。这将限制实验过程中可能发生的变化

  • 重复这些实验,直到它们具有统计学意义。由于冷启动,仅运行一次基准测试很可能不会给出平均行为

  • 由于性能主要随频率变化,您还可以考虑固定系统的频率,并测量性能/MHz。这将是一个更好的比较,因为这是两种不同的体系结构,具有不同的功耗/性能权衡。但是,将实际执行时间作为比较点也没有问题。选择比较指标主要取决于您的最终目标


  • 希望这有帮助

    “单核E5-26xx v4”不存在,您的代码可能运行在另一个CPU上的虚拟机上。请注意,为了允许虚拟机迁移到不同的实际计算机,通常会选择一个“最小公分母虚拟CPU”。这两个可执行文件之间有区别吗?如果是这样,那就可以解释了。只需在一个系统上编译,并在两个测试系统上运行该可执行文件。
    ➜  ~ gcc -std=c11 a.c -O2 && time ./a.out
    2420917449941559086
    ./a.out  7.01s user 0.00s system 99% cpu 7.019 total