Несподівана і незрозуміла повільна (і незвичайна) продуктивність пам'яті за допомогою Xeon Skylake SMP


27

Ми тестували сервер за допомогою 2x процесорів Xeon Gold 6154 з материнською платою Supermicro X11DPH-I та 96 ГБ оперативної пам’яті, і виявили деякі дуже дивні проблеми з продуктивністю, пов’язаними з пам’яттю, порівняно з роботою лише з 1 процесором (один сокет порожній), подібний подвійний Процесор Haswell Xeon E5-2687Wv3 (для цієї серії тестів, але інші Broadwells виконують аналогічно), Broadwell-E i7s та Skylake-X i9s (для порівняння).

Можна було б очікувати, що процесори Skylake Xeon з більш швидкою пам'яттю працюватимуть швидше, ніж Haswell, коли мова йде про різні функції memcpy і навіть розподіл пам'яті (не висвітлюється в тестах нижче, як ми знайшли вирішення), а замість того, щоб встановлені обидва процесори , Skylake Xeons працює майже з половиною швидкості, як Haswell Xeons, і навіть менше, порівняно з i7-6800k. Що ще дивніше - це коли за допомогою Windows VirtualAllocExNuma призначити вузол NUMA для розподілу пам’яті, тоді як функції звичайної копіювання пам’яті очікуються гірше на віддаленому вузлі порівняно з локальним вузлом, функції копіювання пам'яті, що використовують регістри SSE, MMX та AVX, виконують значно більше швидше на віддаленому вузлі NUMA, ніж на локальному вузлі (що?). Як зазначалося вище, із Skylake Xeons,

Я не впевнений, що це помилка на материнській платі або процесорі, або з UPI vs QPI, або ніщо з перерахованого вище, але жодна комбінація налаштувань BIOS, мабуть, не допоможе. Відключення NUMA (не включене до результатів тестування) в біографії покращує продуктивність усіх функцій копіювання за допомогою регістрів SSE, MMX та AVX, але всі інші функції копіювання простої пам'яті також зазнають великих втрат.

Для нашої програми тестування ми протестували як за допомогою вбудованих функцій складання, так і для _mmвнутрішньої роботи, ми використовували Windows 10 з Visual Studio 2017 для всіх, крім функцій складання, які як msvc ++ не збирають ASM для x64, ми використовували gcc від mingw / msys до компілювати obj-файл за допомогою -c -O2прапорів, які ми включили в посилання MSVC ++.

Якщо система використовує NUMA-вузли, ми перевіряємо обидва нових оператора для розподілу пам’яті з VirtualAllocExNuma для кожного вузла NUMA і робимо сукупне середнє 100 копій буфера пам’яті по 16 МБ для кожної функції копіювання пам’яті, і ми обертаємо, на якому виділенні пам’яті ми знаходимось між кожним набором тестів.

Усі 100 вихідних та 100 цільових буферів вирівняні на 64 байти (для сумісності до AVX512 за допомогою функцій потоку) та ініціалізовані один раз до додаткових даних для вихідних буферів та 0xff для буферів призначення.

Кількість копій в середньому на кожному апараті з кожною конфігурацією змінювалася, оскільки це було набагато швидше, а на інших набагато повільніше.

Результати були такими:

Haswell Xeon E5-2687Wv3 1 процесор (1 порожнє гніздо) на Supermicro X10DAi з 32 ГБ DDR4-2400 (10c / 20t, 25 МБ кешу L3). Але пам’ятайте, тест обертається через 100 пар 16-мегабайтних буферів, тому ми, мабуть, не отримуємо кеш-пам’яті L3.

---------------------------------------------------------------------------
Averaging 7000 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 2264.48 microseconds
asm_memcpy (asm)                 averaging 2322.71 microseconds
sse_memcpy (intrinsic)           averaging 1569.67 microseconds
sse_memcpy (asm)                 averaging 1589.31 microseconds
sse2_memcpy (intrinsic)          averaging 1561.19 microseconds
sse2_memcpy (asm)                averaging 1664.18 microseconds
mmx_memcpy (asm)                 averaging 2497.73 microseconds
mmx2_memcpy (asm)                averaging 1626.68 microseconds
avx_memcpy (intrinsic)           averaging 1625.12 microseconds
avx_memcpy (asm)                 averaging 1592.58 microseconds
avx512_memcpy (intrinsic)        unsupported on this CPU
rep movsb (asm)                  averaging 2260.6 microseconds

Haswell Dual Xeon E5-2687Wv3 2 процесор на Supermicro X10DAi з 64 ГБ оперативної пам’яті

---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 0(local)
---------------------------------------------------------------------------
std::memcpy                      averaging 3179.8 microseconds
asm_memcpy (asm)                 averaging 3177.15 microseconds
sse_memcpy (intrinsic)           averaging 1633.87 microseconds
sse_memcpy (asm)                 averaging 1663.8 microseconds
sse2_memcpy (intrinsic)          averaging 1620.86 microseconds
sse2_memcpy (asm)                averaging 1727.36 microseconds
mmx_memcpy (asm)                 averaging 2623.07 microseconds
mmx2_memcpy (asm)                averaging 1691.1 microseconds
avx_memcpy (intrinsic)           averaging 1704.33 microseconds
avx_memcpy (asm)                 averaging 1692.69 microseconds
avx512_memcpy (intrinsic)        unsupported on this CPU
rep movsb (asm)                  averaging 3185.84 microseconds
---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 1
---------------------------------------------------------------------------
std::memcpy                      averaging 3992.46 microseconds
asm_memcpy (asm)                 averaging 4039.11 microseconds
sse_memcpy (intrinsic)           averaging 3174.69 microseconds
sse_memcpy (asm)                 averaging 3129.18 microseconds
sse2_memcpy (intrinsic)          averaging 3161.9 microseconds
sse2_memcpy (asm)                averaging 3141.33 microseconds
mmx_memcpy (asm)                 averaging 4010.17 microseconds
mmx2_memcpy (asm)                averaging 3211.75 microseconds
avx_memcpy (intrinsic)           averaging 3003.14 microseconds
avx_memcpy (asm)                 averaging 2980.97 microseconds
avx512_memcpy (intrinsic)        unsupported on this CPU
rep movsb (asm)                  averaging 3987.91 microseconds
---------------------------------------------------------------------------
Averaging 6900 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 3172.95 microseconds
asm_memcpy (asm)                 averaging 3173.5 microseconds
sse_memcpy (intrinsic)           averaging 1623.84 microseconds
sse_memcpy (asm)                 averaging 1657.07 microseconds
sse2_memcpy (intrinsic)          averaging 1616.95 microseconds
sse2_memcpy (asm)                averaging 1739.05 microseconds
mmx_memcpy (asm)                 averaging 2623.71 microseconds
mmx2_memcpy (asm)                averaging 1699.33 microseconds
avx_memcpy (intrinsic)           averaging 1710.09 microseconds
avx_memcpy (asm)                 averaging 1688.34 microseconds
avx512_memcpy (intrinsic)        unsupported on this CPU
rep movsb (asm)                  averaging 3175.14 microseconds

Skylake Xeon Gold 6154 1 процесор (1 порожнє гніздо) на Supermicro X11DPH-I з 48 ГБ DDR4-2666 (18c / 36t, 24,75 МБ кеш-пам'яті L3)

---------------------------------------------------------------------------
Averaging 5000 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 1832.42 microseconds
asm_memcpy (asm)                 averaging 1837.62 microseconds
sse_memcpy (intrinsic)           averaging 1647.84 microseconds
sse_memcpy (asm)                 averaging 1710.53 microseconds
sse2_memcpy (intrinsic)          averaging 1645.54 microseconds
sse2_memcpy (asm)                averaging 1794.36 microseconds
mmx_memcpy (asm)                 averaging 2030.51 microseconds
mmx2_memcpy (asm)                averaging 1816.82 microseconds
avx_memcpy (intrinsic)           averaging 1686.49 microseconds
avx_memcpy (asm)                 averaging 1716.15 microseconds
avx512_memcpy (intrinsic)        averaging 1761.6 microseconds
rep movsb (asm)                  averaging 1977.6 microseconds

Skylake Xeon Gold 6154 2 процесор на Supermicro X11DPH-I з 96 ГБ DDR4-2666

---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 0(local)
---------------------------------------------------------------------------
std::memcpy                      averaging 3131.6 microseconds
asm_memcpy (asm)                 averaging 3070.57 microseconds
sse_memcpy (intrinsic)           averaging 3297.72 microseconds
sse_memcpy (asm)                 averaging 3423.38 microseconds
sse2_memcpy (intrinsic)          averaging 3274.31 microseconds
sse2_memcpy (asm)                averaging 3413.48 microseconds
mmx_memcpy (asm)                 averaging 2069.53 microseconds
mmx2_memcpy (asm)                averaging 3694.91 microseconds
avx_memcpy (intrinsic)           averaging 3118.75 microseconds
avx_memcpy (asm)                 averaging 3224.36 microseconds
avx512_memcpy (intrinsic)        averaging 3156.56 microseconds
rep movsb (asm)                  averaging 3155.36 microseconds
---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for VirtualAllocExNuma to NUMA node 1
---------------------------------------------------------------------------
std::memcpy                      averaging 5309.77 microseconds
asm_memcpy (asm)                 averaging 5330.78 microseconds
sse_memcpy (intrinsic)           averaging 2350.61 microseconds
sse_memcpy (asm)                 averaging 2402.57 microseconds
sse2_memcpy (intrinsic)          averaging 2338.61 microseconds
sse2_memcpy (asm)                averaging 2475.51 microseconds
mmx_memcpy (asm)                 averaging 2883.97 microseconds
mmx2_memcpy (asm)                averaging 2517.69 microseconds
avx_memcpy (intrinsic)           averaging 2356.07 microseconds
avx_memcpy (asm)                 averaging 2415.22 microseconds
avx512_memcpy (intrinsic)        averaging 2487.01 microseconds
rep movsb (asm)                  averaging 5372.98 microseconds
---------------------------------------------------------------------------
Averaging 4100 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 3075.1 microseconds
asm_memcpy (asm)                 averaging 3061.97 microseconds
sse_memcpy (intrinsic)           averaging 3281.17 microseconds
sse_memcpy (asm)                 averaging 3421.38 microseconds
sse2_memcpy (intrinsic)          averaging 3268.79 microseconds
sse2_memcpy (asm)                averaging 3435.76 microseconds
mmx_memcpy (asm)                 averaging 2061.27 microseconds
mmx2_memcpy (asm)                averaging 3694.48 microseconds
avx_memcpy (intrinsic)           averaging 3111.16 microseconds
avx_memcpy (asm)                 averaging 3227.45 microseconds
avx512_memcpy (intrinsic)        averaging 3148.65 microseconds
rep movsb (asm)                  averaging 2967.45 microseconds

Skylake-X i9-7940X на ASUS ROG Rampage VI Extreme з 32 ГБ DDR4-4266 (14c / 28t, 19,25 МБ кеш-пам'яті L3) (розігнаний до 3,8 ГГц / 4,4 ГГц турбо, DDR на 4040 МГц, цільова частота AVX 3737 МГц, Target AVX- 512 частоти 3535 МГц, цільова частота кешу 2424 МГц)

---------------------------------------------------------------------------
Averaging 6500 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 1750.87 microseconds
asm_memcpy (asm)                 averaging 1748.22 microseconds
sse_memcpy (intrinsic)           averaging 1743.39 microseconds
sse_memcpy (asm)                 averaging 3120.18 microseconds
sse2_memcpy (intrinsic)          averaging 1743.37 microseconds
sse2_memcpy (asm)                averaging 2868.52 microseconds
mmx_memcpy (asm)                 averaging 2255.17 microseconds
mmx2_memcpy (asm)                averaging 3434.58 microseconds
avx_memcpy (intrinsic)           averaging 1698.49 microseconds
avx_memcpy (asm)                 averaging 2840.65 microseconds
avx512_memcpy (intrinsic)        averaging 1670.05 microseconds
rep movsb (asm)                  averaging 1718.77 microseconds

Broadwell i7-6800k на ASUS X99 з 24 ГБ DDR4-2400 (6c / 12t, 15 Мб кешу L3)

---------------------------------------------------------------------------
Averaging 64900 copies of 16MB of data per function for operator new
---------------------------------------------------------------------------
std::memcpy                      averaging 2522.1 microseconds
asm_memcpy (asm)                 averaging 2615.92 microseconds
sse_memcpy (intrinsic)           averaging 1621.81 microseconds
sse_memcpy (asm)                 averaging 1669.39 microseconds
sse2_memcpy (intrinsic)          averaging 1617.04 microseconds
sse2_memcpy (asm)                averaging 1719.06 microseconds
mmx_memcpy (asm)                 averaging 3021.02 microseconds
mmx2_memcpy (asm)                averaging 1691.68 microseconds
avx_memcpy (intrinsic)           averaging 1654.41 microseconds
avx_memcpy (asm)                 averaging 1666.84 microseconds
avx512_memcpy (intrinsic)        unsupported on this CPU
rep movsb (asm)                  averaging 2520.13 microseconds

Функції складання походять від fast_memcpy в xine-libs, в основному використовуються лише для порівняння з оптимізатором msvc ++.

Вихідний код для тесту доступний за посиланням https://github.com/marcmicalizzi/memcpy_test (його потрібно розмістити трохи довше)

Хтось інший натрапив на це чи хтось має розуміння, чому це може статися?


Оновлення 2018-05-15 13: 40EST

Отже, як запропонував Пітер Кордес, я оновив тест, щоб порівняти попередньо завантажений та не попередній вибір, і NT-магазини проти звичайних магазинів, і налаштував попереднє завантаження, виконане в кожній функції (у мене немає жодного змістовного досвіду з написанням попереднього завантаження, так що якщо Я роблю помилки з цим, будь ласка, повідомте мене, і я відповідно скоригую тести. Попереднє завантаження має вплив, так що принаймні щось робить ). Ці зміни відображені в останній редакції посилання на GitHub, який я зробив раніше, для тих, хто шукає вихідний код.

Я також додав SSE4.1 тетсру, так як до SSE4.1 я не можу знайти _mm_stream_load(я спеціально використовував _mm_stream_load_si128) функції SSE, так sse_memcpyі sse2_memcpyне може бути повністю використанням магазинів NT, і а також avx_memcpyфункція використовує функції AVX2 для завантаження потоку

Я вирішив поки не робити тестування на чисті схеми доступу до магазинів та чистих навантажень, тому що я не впевнений, чи чистий магазин міг би мати сенс, оскільки без навантаження на регістри, до яких він має доступ, дані були б безглуздими та неперевіреними.

Цікаві результати нового тесту полягали в тому, що в налаштуваннях Xeon Skylake Dual Socket і лише в цій програмі функції магазину були фактично значно швидшими, ніж потокові функції NT для копіювання пам'яті в 16 МБ. Так само лише в цій програмі (і тільки при включеному попередньому виборі LLC в BIOS), prefetchnta в деяких тестах (SSE, SSE4.1) перевершує як prefetcht0, так і без попереднього вибору.

Невичерпні результати цього нового тесту занадто довгі, щоб додати до публікації, тому вони розміщуються у тому самому сховищі git, що і вихідний код у results-2018-05-15

Я все ще не розумію, чому для потокової передачі NT-магазинів віддалений вузол NUMA швидше під час налаштування SMP Skylake, хоча використання звичайних сховищ все ще швидше, ніж у локальному вузлі NUMA


1
Ще не було можливості переварити ваші дані, але дивіться також. Чому Skylake набагато кращий, ніж Broadwell-E, для однопотокової пропускної здатності пам'яті? . SKX має високу затримку / низьку пропускну здатність на одне ядро ​​до L3 / пам'яті в цілому, згідно з тестуванням Mysticial та іншими результатами. Ви, мабуть, це бачите.
Пітер Кордес

1
Чи є ваша копія, використовуючи магазини NT? Я щойно перевірив, і всі ваші копії, крім MMX, використовують prefetchntaі магазини NT! Це величезний важливий факт, який ви залишили без свого питання! Див. Розширений REP MOVSB ​​для мемкпії, щоб отримати докладнішу інформацію про rep movsbвекторні магазини ERMSB проти NT у порівнянні зі звичайними магазинами. Возитися з цим було б корисніше, ніж MMX проти SSE. Можливо, просто використовуйте AVX та / або AVX512 і спробуйте NT порівняно з регулярними та / або виключаючи попередній вибір SW.
Пітер Кордес

1
Ви налаштували відстань попереднього вибору для ваших машин SKX? SKX prefetchntaобходить L3 так само, як L2 (тому що L3 не включає включення), тому він більш чутливий до попередньої вибору відстані (занадто пізно і дані повинні надходити знову від DRAM, а не тільки L3), тому він більш "крихкий" ( чутливий до налаштування правильної відстані). Ваша відстань попереднього вибору виглядає досить низькою, хоча менше 500 байт, якщо я правильно читаю. @ Тестування Mysticial на SKX виявило, що це prefetchntaможе бути великим уповільненням цього ураху ), і він не рекомендує цього.
Пітер Кордес

1
Тут ви, безумовно, маєте кілька цікавих результатів, але нам потрібно відплутати їх від різних ефектів . Наявність номерів як із магазинами NT, так і без них може сказати нам щось корисне про поведінку NUMA. Населення 2-го сокета змушує навіть локальний L3 пропустити віддалений процесор, принаймні, на Broadwell / Haswell. Подвійні гнізда E5 Xeons не мають фільтра snoop. Я думаю , що золото Xeons зробити є Snoop фільтри, тому що вони здатні працювати в більш систем двопроцесорних. Але я не впевнений, наскільки вона велика, або що це насправді означає: PI не робив налаштування перф. Пам'яті на мульти-сокет.
Пітер Кордес

2
SKX - принципово інший взаємозв'язок; сітка замість кільця. Це цікавий результат, але не неймовірний і не може бути ознакою неправильної конфігурації. IDK, сподіваємось, хтось інший, який має більше досвіду роботи з обладнанням, може пролити більше світла.
Пітер Кордес

Відповіді:


0

Ваша пам'ять - неправильний ранг? Можливо, на вашій платі є якась дивна річ з рейтингом пам'яті, коли ви додаєте цей другий процесор? Я знаю, коли у вас є Quad-процесорні машини, вони роблять усілякі дивні речі, щоб зробити пам'ять належним чином, і якщо у вас неправильна ранжирована пам'ять, іноді вона буде працювати, але повертайте годинник назад, як 1/4 або 1/2 швидкості. Можливо, SuperMicro щось зробив у цій платі, щоб перетворити DDR4 і Dual CPU на Quad Channel, і він використовує аналогічну математику. Неправильний ранг == 1/2 швидкості.


Схоже, це не так, вся пам'ять становить 1R8, і відповідає ранжиру супермікро qvl для материнської плати. Варто було перевірити, хоча!
Марк Мікаліцці

Я знаю, що це цілком інша система, але про це я також мав на увазі. qrl.dell.com/Files/en-us/Html/Manuals/R920/… Ви зауважите, що вимоги до ранжування змінюються, коли ви збільшуєте кількість паличок / процесорів.
thelanranger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.