Как машина с более высокой производительностью процессора (согласно gprof) имеет худшую производительность в реальном времени?

Задний план

У меня есть программа с интенсивными вычислениями, которую я пытаюсь запустить на одном узле суперкомпьютера. Вот характеристики одного из узлов суперкомпьютера:

  • ОС: Redhat 6 Enterprise 64-битная
  • ЦП: Intel 2x 6-ядерный 2,8 ГГц (12 ядер) -- кэш 12 МБ
  • Оперативная память: 24 ГБ @ ???? МГц (нет доступа к sudo для проверки dmidecode)

Я также тестировал эту программу на виртуальной машине Ubuntu, работающей на моем MacBook:

  • ОС: Ubuntu 13.10 64-битная
  • ЦП: Intel 4x 2,30 ГГц (4 ядра) — кэш-память 6 МБ
  • Оперативная память: 3 ГБ @ 1600 МГц

Программа построена с использованием одной и той же версии gcc на обеих машинах. Однако для упрощенного тестового запуска программы реальное время запуска программы на суперкомпьютере значительно больше, чем на моей виртуальной машине.

Для меня это не имело смысла, и, чтобы еще больше запутать, когда я запускаю gprof в своей программе, это показывает, что суперкомпьютер действительно быстрее, чем моя виртуальная машина. В таблице ниже показано разное время, которое я вижу для своей программы на каждой машине (SC = суперкомпьютер, VM = виртуальная машина):

                            | SC   | VM    |
|---------------------------|------|-------|
| Release (-O3) Real Time   | 15s  | 3s    |
| Debug (-g -pg) Real Time  | 55s  | 35s   |
| Debug (-g -pg) gprof Time | 6.10 | 9.24s |

Это происходит независимо от того, сколько раз я его тестирую, а в случае с суперкомпьютером я единственный пользователь на вычислительном узле, когда программа работает (т. е. она не должна конфликтовать с другими процессами).

В моей программе задействовано очень мало операций ввода-вывода. Он читает файл размером 1,4 МБ и выводит файл размером 82 байта.

Вопрос

Что происходит, из-за чего производительность суперкомпьютера в реальном времени ухудшается, когда gprof указывает на то, что производительность процессора лучше? Что я могу сделать, чтобы улучшить производительность суперкомпьютера в реальном времени?

Дополнительная информация

Программа тратит большую часть своего времени на создание и решение системы линейных уравнений. Фактический решатель — это библиотека с поддержкой openmpi, которая использует отдельные потоки, соответствующие количеству доступных ядер на машине.

Я могу запустить отдельную тестовую программу, используя ту же библиотеку линейного решателя, которая считывает более сложную линейную систему из файла в формате Matrix Market (690 МБ — матрица A почти 2 миллиона в квадрате) и решает линейную систему независимо от написанной мной программы. В этом случае суперкомпьютер (48 с) быстрее виртуальной машины (74 с). Это указывает мне как на то, что проблема не в линейном решателе, так и на то, что проблема не связана с вводом-выводом, поскольку этот тест гораздо более интенсивный ввод-вывод.

Информация о процессоре

SC

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 0
cpu cores   : 6
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 1
cpu cores   : 6
apicid      : 2
initial apicid  : 2
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 2
cpu cores   : 6
apicid      : 4
initial apicid  : 4
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 8
cpu cores   : 6
apicid      : 16
initial apicid  : 16
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 4
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 9
cpu cores   : 6
apicid      : 18
initial apicid  : 18
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 5
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 0
siblings    : 6
core id     : 10
cpu cores   : 6
apicid      : 20
initial apicid  : 20
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5600.41
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 6
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 0
cpu cores   : 6
apicid      : 32
initial apicid  : 32
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 7
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 1
cpu cores   : 6
apicid      : 34
initial apicid  : 34
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 8
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 2
cpu cores   : 6
apicid      : 36
initial apicid  : 36
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 9
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 8
cpu cores   : 6
apicid      : 48
initial apicid  : 48
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 10
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 9
cpu cores   : 6
apicid      : 50
initial apicid  : 50
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 11
vendor_id   : GenuineIntel
cpu family  : 6
model       : 44
model name  : Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
stepping    : 2
cpu MHz     : 2800.207
cache size  : 12288 KB
physical id : 1
siblings    : 6
core id     : 10
cpu cores   : 6
apicid      : 52
initial apicid  : 52
fpu     : yes
fpu_exception   : yes
cpuid level : 11
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat epb dts tpr_shadow vnmi flexpriority ept vpid
bogomips    : 5599.85
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

VM

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 2294.125
cache size  : 6144 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep
bogomips    : 4588.25
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 2294.125
cache size  : 6144 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep
bogomips    : 4588.25
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 2
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 2294.125
cache size  : 6144 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep
bogomips    : 4588.25
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping    : 9
microcode   : 0x15
cpu MHz     : 2294.125
cache size  : 6144 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep
bogomips    : 4588.25
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

person Neal Kruis    schedule 26.03.2014    source источник
comment
относительные размеры кеша или время доступа к памяти?   -  person Digikata    schedule 27.03.2014
comment
Я обновил системные спецификации, чтобы отразить это... хотя я не могу узнать скорость памяти суперкомпьютера.   -  person Neal Kruis    schedule 27.03.2014
comment
Я бы поставил много на размер кеша.   -  person Kevin    schedule 27.03.2014
comment
ой, извини. Только что исправил эту ошибку: суперкомпьютер действительно имеет больший кеш.   -  person Neal Kruis    schedule 27.03.2014
comment
И время, которое вы сообщаете, это время настенных часов? Что говорит команда times (система/пользователь), каково количество ошибок страниц? Где потрачено время? (гпроф-а, IIRC)   -  person wildplasser    schedule 27.03.2014
comment
Можете ли вы опубликовать полный вывод cat /proc/cpuinfo на обеих машинах? Процессоры могут иметь разную архитектуру, что компенсирует разницу в ГГц и размере кэша. Кроме того, вы единственный пользователь на суперкомпьютере? Может быть, в фоновом режиме выполняются другие задачи, что замедляет ваши вычисления? Какую нагрузку показывает uptime?   -  person Michał Kosmulski    schedule 27.03.2014
comment
@NealKruis Хорошо, значит, это не другие процессы, работающие в фоновом режиме. Как насчет cpuinfo?   -  person Michał Kosmulski    schedule 27.03.2014
comment
Кстати, реальное время, показанное gprof, как бы говорит о том, что ВМ, а не SC быстрее.   -  person Michał Kosmulski    schedule 27.03.2014
comment
Какие флаги (особенно архитектурные) вы использовали для компиляции бинарника? В какой-то момент я видел определенный выбор архитектуры, снижающий производительность на некоторых машинах, так что, может быть, это так?   -  person Michał Kosmulski    schedule 27.03.2014
comment
@MichałKosmulski, возможно, ты что-то понял. Я не указываю никаких архитектурных флагов. Единственные флаги, которые я использую, это -g -pg для отладки и -O3 -DNDEBUG для выпуска. Я предполагаю, что по умолчанию используется generic.   -  person Neal Kruis    schedule 27.03.2014
comment
На справочной странице неясно, что именно происходит, когда вы не указываете -march и -mtune напрямую, но кажется, что значения по умолчанию могут различаться в разных версиях gcc и могут зависеть от текущего процессора. Кроме того, -O3 содержит несколько рискованных оптимизаций, которые могут помочь, но иногда могут и навредить. Как насчет эксперимента: скомпилируйте программу на другом компьютере (например, на суперкомпьютере, если вы до сих пор компилировали на своей рабочей станции) и посмотрите, получите ли вы такие же результаты, как сейчас?   -  person Michał Kosmulski    schedule 27.03.2014
comment
@MichałKosmulski, я не знаю, что вы имеете в виду под другой машиной. До сих пор я компилировал на суперкомпьютере, своем MacBook и виртуальной машине (все с одинаковыми флагами компиляции). Мой MacBook и моя виртуальная машина похожи по производительности, но суперкомпьютер работает намного медленнее.   -  person Neal Kruis    schedule 27.03.2014
comment
Я думал, возможно, вы скомпилировали программу на одну машину и распространили бинарные файлы на другие машины, но теперь я знаю, что это не так.   -  person Michał Kosmulski    schedule 27.03.2014
comment
Узел кластера представляет собой систему ccNUMA. Убедитесь, что все потоки привязаны к определенному ядру каждый, в противном случае планировщик ОС, перемещающий потоки вокруг теста, сильно повлияет.   -  person Hristo Iliev    schedule 28.03.2014


Ответы (2)


Вероятно, это не ответ на ваш вопрос, а скорее расширенный комментарий. Учитывая, что ни одной строки кода не показано, я могу только догадываться о характере проблемы. Двухпроцессорная система с Westmere's представляет собой платформу ccNUMA (неоднородный доступ к памяти, согласованный с кэшем). В системах NUMA глобальная память разделена на области, некоторые из которых являются локальными, а другие — удаленными по отношению к любому заданному ядру ЦП. Доступ к локальной памяти менее затратен с точки зрения циклов памяти, и обычно пропускная способность выше. Ваш MacBook имеет один процессорный разъем и не является системой NUMA.

При этом очень важно включить привязку процессов и потоков (или закрепление) в системах ccNUMA. Планировщик ОС обычно старается поддерживать равномерную загрузку всех ядер ЦП и поэтому постоянно перемещает потоки (процессы как наборы потоков). Если поток выделяет память на одном NUMA-узле, а затем перемещается на другой, доступ к памяти будет значительно замедлен. Этому можно противодействовать с помощью механизма привязки к процессору, который предоставляет ОС список процессоров, на которых может выполняться данный поток. Фактический акт фиксации маски сходства называется привязкой или закреплением. Привязка также важна, когда речь идет об использовании кеша, поскольку перемещение потока с одного ядра на другое того же сокета приводит к перезагрузке кешей L1 и L2, а перемещение к другому сокету приводит к перезагрузке кешей L1, L2 и L3. .

Привязка процесса легко выполняется с помощью taskset или numactl. Связывание потоков является более сложным, поскольку оно зависит от механизма потоков. OpenMP 4.0 стандартизирует весь процесс, но большинство реализаций OpenMP в настоящее время относятся к предыдущей эпохе (т. е. до версии 3.1), и поэтому приходится прибегать к методам, специфичным для производителя. Для GCC / libgomp путь — установка файла GOMP_CPU_AFFINITY. Для вашего 12-ядерного узла кластера это должно выполняться следующим образом:

GOMP_CPU_AFFINITY="0-11" ./executable

Кроме того, OpenMP влечет за собой некоторые накладные расходы, а с небольшими матрицами эти накладные расходы могут быть настолько высокими, что сводят на нет преимущества многопоточности. Накладные расходы также растут с увеличением количества потоков. Поэтому вам следует сравнить вашу программу с одинаковым количеством потоков в виртуальной машине и на узле кластера. Установка OMP_NUM_THREADS должна работать для хорошо написанных кодов OpenMP, которые не пытаются сами исправить количество потоков на основе какой-то внутренней логики.

В резюме вы должны попробовать что-то вроде:

GOMP_CPU_AFFINITY="0-3" OMP_NUM_THREADS=4 ./executable

на обеих системах. Это устранит влияние NUMA и различные накладные расходы OpenMP. Любые оставшиеся различия будут связаны с различными архитектурами кэш-памяти L3 (Ivy Bridge имеет сегментированный кэш L3, который представил Sandy Bridge), уменьшенными задержками некоторых инструкций в Ivy Bridge, различным управлением питанием (возможно, у X5660 отключен TurboBoost?) и возможно, разные наборы инструкций, используемые библиотекой решателя, как указано @amdn.

person Hristo Iliev    schedule 28.03.2014

Примечание 3. По последним данным, суперкомпьютер имеет более быструю подсистему ввода-вывода, но ему не хватает скорости в матричных операциях, поскольку ЦП не имеет расширения AVX. MacBook медленнее выполняет ввод-вывод с диска, но может выполнять вычисления быстрее, поскольку его ЦП имеет расширение AVX. Возможно, суперкомпьютеру потребовалось 33 секунды для загрузки 690 МБ и 15 секунд для вычислений, а MacBook потребовалась 71 секунда для загрузки 690 МБ и 3 секунды для вычислений. Это соответствует наблюдаемому результату в 48 секунд для суперкомпьютера и 74 секундам для MacBook.

Примечание 2. У меня есть новая теория. Я думаю, что когда вы запускаете отдельную тестовую программу, и суперкомпьютер, и ваш MacBook ограничивают пропускную способность памяти. Данные там составляют 690 МБ, что не помещается в кэш процессора, тогда как данные в ваших производственных запусках составляют 1,4 МБ, что помещается в кэш ЦП. В ЦП MacBook встроенный контроллер памяти является двухканальным. На суперкомпьютере контроллер памяти процессора X5660 Xeon поддерживает три канала. Таким образом, для очень больших наборов данных, которые не помещаются в кэш-память последнего уровня ЦП, суперкомпьютер будет работать быстрее, поскольку у него больше пропускная способность памяти (3 канала против 2). Для небольших рабочих наборов, которые помещаются в кэш ЦП, MacBook будет быстрее, потому что проблема становится связанной с ЦП, а ЦП MacBook имеет инструкции AVX, которые специализируются на линейной алгебре.

Исходный ответ

Скорее всего, ваша библиотека линейных решателей выбирает самую быструю процедуру на основе определения возможностей процессора во время выполнения. «Суперкомпьютер» может иметь больше ядер, кэш-память большего размера, больше памяти и работать на более высокой частоте, но у него нет инструкций Intel® Advanced Vector Extensions (Intel® AVX), доступных в вашем компьютере. Макбук. Вот обсуждение AVX для линейной алгебры

Некоторые цитаты инженеров Intel

Недавно мы завершили серию тестов SSE и AVX на Sandy Bridge и Ivy Bridge, и диапазон повышения производительности составил от ~3x до ~6x (для операции sqrt), а коды (C/C++) были агрессивно оптимизированы Intel C++. компилятор 13.0.0.089 (начальный выпуск).

И это

Умножение матриц — идеальное приложение для демонстрации производительности AVX. Это сильно зависит от тайлинга для местоположения L1, поэтому новый акцент делается на библиотеках производительности, таких как MKL.

http://ark.intel.com/compare/47921,64900

введите здесь описание изображения

person amdn    schedule 26.03.2014
comment
Как я упоминал в дополнительной информации, я не думаю, что проблема в линейном решателе. Я протестировал сам линейный решатель и обнаружил, что суперкомпьютер действительно может решить систему быстрее, чем моя виртуальная машина. - person Neal Kruis; 27.03.2014
comment
@NealKruis, Ой, я пропустил это ... Я сделаю пометку в своем ответе, но оставлю ее на месте на случай, если это поможет кому-то еще понять, что происходит. - person amdn; 27.03.2014
comment
Обновление @NealKruis: я думаю, что характеристики производительности этой программы будут меняться от привязки ЦП к пропускной способности памяти, ограниченной по мере увеличения размера матрицы — 3 канала памяти превзойдут 2 канала памяти для больших наборов данных, а инструкции AVX превзойдут SSE для небольших наборов данных. ... см. обновленный ответ выше. - person amdn; 28.03.2014
comment
1,4 МБ в моем производственном цикле — это входной файл, который я использую для создания матрицы A. Сама матрица хранится в памяти и имеет примерно такой же размер, как файл Matrix Market размером 690 МБ. В любом случае решается одна и та же линейная система, требующая одинакового объема памяти. - person Neal Kruis; 28.03.2014
comment
Так не связан ли программный ввод-вывод при загрузке файла размером 690 МБ? - person amdn; 28.03.2014
comment
Возможно, это могло бы нам что-то сказать, если бы мы знали, сколько времени потребовалось для загрузки 690 МБ и сколько времени потребовалось для вычислений. Возможно, суперкомпьютеру потребовалось 33 секунды для загрузки 690 МБ и 15 секунд для вычислений, а MacBook потребовалась 71 секунда для загрузки 690 МБ и 3 секунды для вычислений. - person amdn; 28.03.2014
comment
Большая часть времени (~70%) тратится на решение линейной системы, а не на чтение файла. Имейте в виду, что это тот случай, когда я передаю линейную систему непосредственно решателю, а суперкомпьютер действительно превосходит мою виртуальную машину. Суть, которую я пытался подчеркнуть в своем вопросе, заключалась в том, что моя программа имеет очень небольшие требования к вводу-выводу, в отличие от решения Matrix Market, что указывает на то, что суперкомпьютер не замедляется операциями ввода-вывода. - person Neal Kruis; 28.03.2014
comment
Хорошо, если дело не в ЦП, не в подсистеме ввода-вывода и не в пропускной способности памяти, то есть некоторый эффект из-за другой среды (ядро/гипервизор на виртуальной машине). - person amdn; 28.03.2014