Почему этот процессор работает намного быстрее? - PullRequest
3 голосов
/ 27 октября 2019

Я написал программу переменного тока, работающую на Intel i5-7500 (kubuntu с виртуальной коробкой на win10) и Intel Xeon E5-26xx v4 (облако tenxun). Я думаю, что Intel i5-7500 будет быстрее (процессор МГц: 3,4 ГГц), но Intel Xeon E5-26xx v4 (процессор МГц: 2,4 ГГц) на самом деле быстрее. Может кто-нибудь сказать мне причину, плз?

#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

Процессор Intel (R) Xeon (R) E5-26xx v4 env:

➜  ~ 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)
➜  ~ lscpu 
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               79
Model name:          Intel(R) Xeon(R) CPU E5-26xx v4
Stepping:            1
CPU MHz:             2394.454
BogoMIPS:            4788.90
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            4096K
NUMA node0 CPU(s):   0
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti bmi1 avx2 bmi2 rdseed adx xsaveopt

результат равен

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

Процессор Intel® Core ™ TM i5-7500 @ 3,40 ГГц env:

➜  ~ 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)
➜  ~ lscpu 
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
Stepping:            9
CPU MHz:             3408.002
BogoMIPS:            6816.00
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            6144K
NUMA node0 CPU(s):   0-3
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt flush_l1d

результат

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

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Этот тип кода должен работать намного быстрее на Core i5-7500, с одним тактом на одну итерацию и в одноядерном турбо-режиме. При частоте 3,8 ГГц ожидаемое время работы составляет около 3,25 секунды.

Если процессор не имеет проблем с обработкой таких коротких циклов (в чем я сомневаюсь), вероятно, это сочетание накладных расходов Windows и Virtualbox, которое замедляет его в вашемкейс. Неправильно настроенное управление питанием может быть другой причиной.

EDIT Я обнаружил систему с процессором 7-го поколения Core i5 (хотя и немного другим), и на голом железе он работает в циклепо одному циклу на итерацию.

1 голос
/ 10 ноября 2019

Основной проблемой здесь является тот факт, что вы работаете в облаке и используете виртуализацию поверх существующей ОС. Существует несколько причин, по которым вы не видите ожидаемых результатов:

В облаке у вас нет контроля над тем, как виртуальная машина совместно использует физические ресурсы (т. Е. Сервер-узел). Облачные провайдеры активно используют балансировку нагрузки и консолидацию, что приводит к значительным колебаниям производительности. Если вы повторите свой эксперимент, я предполагаю, что вы увидите большие различия в производительности, которые значительно искажают ваши результаты.

В вашей виртуальной настройке вы не предоставляете никаких сведений о конфигурации вашей виртуальной машины. Работа на уровне VM добавляет значительное использование памяти и накладные расходы.

Эти эксперименты на самом деле несопоставимы, учитывая предоставленные вами данные. Запуск одного и того же кода в разных ОС может также привести к другому уровню непредсказуемости. Стратегии управления питанием / температурой и планирования могут сильно отличаться от Windows к Linux. Даже в одной и той же ОС существует множество ручек управления, которых будет достаточно для создания ошибочных измерений.

Если вы хотите сравнить два разных процессора, вот несколько рекомендаций о том, как планировать эксперименты:

  1. Поскольку вы пытаетесь измерить влияние производительности процессора на производительностьа не какой-либо другой компонент в вашей системе, единственной переменной в ваших экспериментах должен быть тип процессора. То есть использовать ту же ОС, те же операционные среды, те же политики управления питанием / температурой, ту же емкость памяти и скорость. Это ограничит различия, которые могут возникнуть во время ваших экспериментов.

  2. Повторяйте эксперименты, пока они не станут статистически значимыми. Запуск теста только один раз, скорее всего, не даст вам среднего поведения из-за холодного старта.

  3. Поскольку производительность в основном зависит от частоты, вы также можете подумать о фиксировании частоты ваших систем и измерить производительность / МГц. Это будет лучшее сравнение, так как это две разные архитектуры с разным соотношением мощности и производительности. Но также нет проблем с рассмотрением фактического времени выполнения в качестве точки сравнения. Выбор метрики сравнения в основном зависит от вашей конечной цели.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...