Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Железные счётчики на страже производительности

1,634 views

Published on

Нередко при анализе производительности приложений приходится много копать. Но просто копать недостаточно, нужно еще разгребать накопанное. Железный век настал более 3000 лет назад, и было бы удивительно, если бы за это время человечество не создало кучу разнообразных железных приспособлений для копания и разгребания.
Данный доклад рассказывает, что же такое «Hardware Performance Counters», где их найти и как их можно использовать для анализа производительности.

Published in: Software
  • Be the first to comment

Железные счётчики на страже производительности

  1. 1. «Железные» счётчики на страже производительности Sergey Kuksenko sergey.kuksenko@oracle.com, @kuksenk0
  2. 2. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 2/65
  3. 3. Глава первая Очень краткое введение в Методологию Оптимизации Производительности, «Что-Где-Как» и «Сверху-Вниз», а также о роли «железных» счетчиков Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 3/65
  4. 4. 3 магических вопроса Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  5. 5. 3 магических вопроса Что? ∙ Что мешает работать быстрее? (monitoring) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  6. 6. 3 магических вопроса Что? ⇒ Где? ∙ Что мешает работать быстрее? (monitoring) ∙ Где это находится? (profiling) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  7. 7. 3 магических вопроса Что? ⇒ Где? ⇒ Как? ∙ Что мешает работать быстрее? (monitoring) ∙ Где это находится? (profiling) ∙ Как это исправить? (tuning/optimizing) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 4/65
  8. 8. Сверху-Вниз ∙ Системный уровень – OS, сеть, диск, процессор/память ∙ Уровень JVM – GC/Heap, JIT, classloading ∙ Уровень приложения – алгоритм, многопоточность, синхронизация, API ∙ Микроархитектурный уровень – caches, code/data alignment, pipeline stalls Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 5/65
  9. 9. Mindmap Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 6/65
  10. 10. Mindmap http://j.mp/PerfMindMap Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 7/65
  11. 11. Сверху-Вниз Мониторим (e.g. mpstat) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  12. 12. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  13. 13. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  14. 14. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  15. 15. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ ∙ Много %idle ⇒ . . . ⇓ Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  16. 16. Сверху-Вниз Мониторим (e.g. mpstat) ∙ Много %sys ⇒ . . . ⇓ ∙ Много %irq, %soft ⇒ . . . ⇓ ∙ Много %iowait ⇒ . . . ⇓ ∙ Много %idle ⇒ . . . ⇓ ∙ Много %user Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 8/65
  17. 17. Глава вторая О высоком. О высокой загрузке процессора, а также главный вопрос жизни и всего остального «Кто виноват?» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 9/65
  18. 18. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  19. 19. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  20. 20. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Профилирование? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  21. 21. CPU Utilization ∙ О чём говорит ∼100% CPU Utilization? – Как часто OS ставит процессы на исполнение. Профилирование? Профилирование покажет «ГДЕ» программа проводит время, без ответа на вопрос «ПОЧЕМУ». Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 10/65
  22. 22. Кто виноват? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
  23. 23. Кто виноват? Сложная микроархитектура современных CPU: e.g. Sergey Kuksenko «Quantum Performance Effects» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 11/65
  24. 24. Кто виноват? Сложная микроархитектура современных CPU: ∙ Плохой алгоритм ⇒ 100% CPU ∙ Ждем данные из памяти ⇒ 100% CPU ∙ Откат из-за непредсказанного перехода ⇒ 100% CPU ∙ Сложные и дорогие операции ⇒ 100% CPU ∙ Не хватает ILP ⇒ 100% CPU ∙ и т.д. ⇒ 100% CPU Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 12/65
  25. 25. Глава третья «Железные» счетчики HWC, PMU - WTF? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 13/65
  26. 26. PMU: Performance Monitoring Unit Performance Monitoring Unit - это встроенный хардверный профайлер внутри процессора. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
  27. 27. PMU: Performance Monitoring Unit Performance Monitoring Unit - это встроенный хардверный профайлер внутри процессора. Устройство PMU (за 21 день) : «Железные» счетчики (Hardware counters, HWC) считают происходящие события (Performance monitoring events) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 14/65
  28. 28. События Читаем документацию от производителя! (e.g. 2 страницы из 32) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 15/65
  29. 29. События Проблемы: ∙ Тысяча их! ∙ Требуют знания микроархитектуры ∙ Платформозависимые – сильно различаются у разных производителей CPU – могут сильно меняться у одного производителя при смене микроархитектуры ∙ Как с ними вообще работать? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 16/65
  30. 30. HWC HWC имеют два режима работы: ∙ Counting mode – if (случилось событие) ++counter; – общая диагностика (ответ на вопрос «ЧТО») ∙ Sampling mode – if (случилось событие) if (++counter < threshold ) INTERRUPT; – позволяет профилировать (ответ на вопрос «ГДЕ») Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 17/65
  31. 31. HWC: Проблемы Событий много, счетчиков мало (e.g. Nehalem: 3 fixed HWC, 4 programmable) ∙ «multiple-running» (с разными событиями) – повторяемость приложения ∙ multiplexing (если тулы позволяют) – стабильность приложения (steady state) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 18/65
  32. 32. HWC: Проблемы (cont.) Sampling mode: ∙ «instruction skid» (невозможность точного связывания события и инструкции) ∙ Uncore events (e.g. у нас общий L3 cache на несколько ядер) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 19/65
  33. 33. HWC: использование ∙ валидация железа ∙ анализ производительности Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
  34. 34. HWC: использование ∙ валидация железа ∙ анализ производительности ∙ run-time tuning (e.g. JRockit, etc.) ∙ security attacks и защита от них ∙ test code coverage ∙ etc. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 20/65
  35. 35. HWC: tools ∙ Oracle Solaris Studio Performance Analyzer ∙ perf (perf_events) (http://perf.wiki.kernel.org) ∙ JMH – perf mode – perfnorm mode (perf нормализованный на количество операций) – perfasm mode (perf + -XX:+PrintAssembly) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 21/65
  36. 36. HWC: tools(cont.) ∙ AMD CodeXL ∙ Intel Vtune Amplifier XE ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 22/65
  37. 37. События perf_events (e.g.) ∙ cycles ∙ instructions ∙ cache-references ∙ cache-misses ∙ branches ∙ branch-misses ∙ bus-cycles ∙ ref-cycles ∙ dTLB-loads ∙ dTLB-load-misses ∙ L1-dcache-loads ∙ L1-dcache-load-misses ∙ L1-dcache-stores ∙ L1-dcache-store-misses ∙ LLC-loads ∙ LLC-load-misses ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 23/65
  38. 38. События Oracle Studio (e.g.) ∙ cycles ∙ insts ∙ branch-instruction-retired ∙ branch-misses-retired ∙ dtlbm ∙ l1h ∙ l1m ∙ l2h ∙ l2m ∙ l3h ∙ l3m ∙ etc... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 24/65
  39. 39. Глава четвертая Я собрал данные HWC, и? или Введение в микроархитектурный анализ производительности Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 25/65
  40. 40. Время работы 𝑡𝑖𝑚𝑒 = 𝑐𝑦𝑐𝑙𝑒𝑠 𝑓 𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦 Оптимизация это уменьшение количества тактов (cycles)! ⋆ ⋆ все остальное - overclocking Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 26/65
  41. 41. ГУМ Главное Уравнение Микроархитектуры: 𝑐𝑦𝑐𝑙𝑒𝑠 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼 = 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 1 𝐼𝑃 𝐶 ∙ PathLength - количество инструкций ∙ CPI - cycles per instruction ∙ IPC - instructions per cycle Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 27/65
  42. 42. 𝑃 𝑎𝑡ℎ𝐿𝑒𝑛𝑔𝑡ℎ * 𝐶𝑃 𝐼 ∙ PathLength - мера эффективности алгоритма (чем меньше, тем лучше) ∙ CPI - мера эффективности работы CPU (чем меньше, тем лучше) – 𝐶𝑃 𝐼 = 4 – плохо! – 𝐶𝑃 𝐼 = 1 ∙ Nehalem – сойдет! ∙ SandyBridge и позже – плоховатенько! – 𝐶𝑃 𝐼 = 0.4 – хорошо! – 𝐶𝑃 𝐼 = 0.2 – идеально! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 28/65
  43. 43. Что делать? ∙ низкий CPI – уменьшаем PathLength – «улучшаем эффективность алгоритма» ∙ большой CPI ⇒ stalls – memory stalls – «улучшаем эффективность структур данных» – branch stalls – «улучшаем логику передачи управления» – instruction dependency – «разрываем зависимости по данным» – long latency ops – «заменяем на полегче» – и т.д. Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 29/65
  44. 44. Проблемы с CPI? Нам нужна классификация проблем! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 30/65
  45. 45. Memory bound ∙ dTLB misses ∙ L1,L2,L3,...,LN misses ∙ NUMA (чужая память) ∙ memory bandwidth ∙ sharing (false/true) ∙ cache line split (не бывает в Java, почти) ∙ store forwarding (маловероятно, да и все равно не исправить на Java уровне) ∙ 4k aliasing (попробуй поймать) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 31/65
  46. 46. Core bound ∙ long latency operations (DIV, SQRT) ∙ FP assist (floating points denormal, NaN, inf) ∙ bad speculation (вызывается непредсказанным переходом) ∙ port saturation (нам не нужно) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 32/65
  47. 47. Front-End bound ∙ iTLB miss ∙ iCache miss ∙ branch mispredict ∙ LSD (loop stream decoder) Можно решить, только если залезть в исходники HotSpot Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 33/65
  48. 48. Примеры Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 34/65
  49. 49. Пример первый Некий «большой» индустриальный Java бенчмарк Который до сих пор снится по ночам многим Java Performance инженерам Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 35/65
  50. 50. Пример 1: perf stat -d 880851.993237 task -clock (msec) 39,318 context -switches 437 cpu -migrations 7,931 page -faults 2 ,275 ,263 ,113 ,376 cycles 1 ,226 ,299 ,634 ,877 instructions # 0.54 insns per cycle 229 ,500 ,265 ,931 branches # 260.544 M/sec 4 ,620 ,666 ,169 branch -misses # 2.01% of all branches 338 ,169 ,489 ,902 L1-dcache -loads # 383.912 M/sec 37 ,937 ,596 ,505 L1-dcache -load -misses # 11.22% of all L1-dcache hits 25 ,232 ,434 ,666 LLC -loads # 28.645 M/sec 7 ,307 ,884 ,874 L1-icache -load -misses # 0.00% of all L1 -icache hits 337 ,230 ,278 ,697 dTLB -loads # 382.846 M/sec 6 ,094 ,356 ,801 dTLB -load -misses # 1.81% of all dTLB cache hits 12 ,210 ,841 ,909 iTLB -loads # 13.863 M/sec 431 ,803 ,270 iTLB -load -misses # 3.54% of all iTLB cache hits 301.557213044 seconds time elapsed Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 36/65
  51. 51. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  52. 52. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Проблемы? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  53. 53. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Посчитаем: 4 × (338 × 109 )+ 12 × ((38 − 25) × 109 )+ 36 × (25 × 109 ) ≈ 2.4 × 1012 cycles ??? Проблемы? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  54. 54. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Посчитаем: 4 × (338 × 109 )+ 12 × ((38 − 25) × 109 )+ 36 × (25 × 109 ) ≈ 2.4 × 1012 cycles ??? Superscalar in Action! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  55. 55. Пример 1: обработанный руками perf stat -d IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 Проблемы! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 37/65
  56. 56. Пример 1: dTLB misses TLB = Translation Lookaside Buffer ∙ Кэш транслятора виртуальных адресов в физические ∙ Каждое обращение к памяти – обращение к TLB ∙ TLB miss может стоить сотни тактов Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
  57. 57. Пример 1: dTLB misses TLB = Translation Lookaside Buffer ∙ Кэш транслятора виртуальных адресов в физические ∙ Каждое обращение к памяти – обращение к TLB ∙ TLB miss может стоить сотни тактов Как проверить: ∙ dtlb_load_misses_miss_causes_a_walk ∙ dtlb_load_misses_walk_duration Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 38/65
  58. 58. Пример 1: dTLB misses IPC 0.54 cycles ×1012 2.28 instructions ×1012 1.23 L1-dcache-loads ×109 338 L1-dcache-load-misses ×109 38 LLC-loads ×109 25 dTLB-loads ×109 337 dTLB-load-misses ×109 6 iTLB-loads ×109 12 iTLB-loads-misses ×106 432 dTLB-walks-duration ×109 296 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 39/65
  59. 59. Пример 1: dTLB misses Что делать: ∙ LargePages (Huge pages) ∙ попытаться уменьшить «Working Set» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 40/65
  60. 60. Пример 1: -XX:+UseLargePages baseline raw IPC 0.54 0.64 cycles ×1012 2.28 2.28 instructions ×1012 1.23 1.46 L1-dcache-loads ×109 338 401 L1-dcache-load-misses ×109 38 38 LLC-loads ×109 25 25 dTLB-loads ×109 337 401 dTLB-load-misses ×109 6 0.24 iTLB-loads-misses ×106 432 27 dTLB-walks-duration ×109 296 2.6 Ускорение – 20% Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
  61. 61. Пример 1: -XX:+UseLargePages baseline raw normalized IPC 0.54 0.64 0.64 cycles ×1012 2.28 2.28 1.9 instructions ×1012 1.23 1.46 1.22 L1-dcache-loads ×109 338 401 334 L1-dcache-load-misses ×109 38 38 32 LLC-loads ×109 25 25 21 dTLB-loads ×109 337 401 334 dTLB-load-misses ×109 6 0.24 0.20 iTLB-loads-misses ×106 432 27 23 dTLB-walks-duration ×109 296 2.6 2.2 Ускорение – 20% Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 41/65
  62. 62. Пример второй Мы нашли горячий метод или О ⋆ применимости алгоритмических оптимизаций ⋆ О-обычное Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 42/65
  63. 63. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j]; } R[i][j] = s; } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
  64. 64. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j]; } R[i][j] = s; } } return result; } 𝑂( 𝑁3)⋆ ⋆ O-большое Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 43/65
  65. 65. Пример 2: "Ok Google" 𝑂( 𝑁2.81) Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 44/65
  66. 66. Пример 2: Very Hot Code N multiply strassen 32 33 𝜇𝑠 64 252 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 2048 32 𝑠 6 𝑠 4096 309 𝑠 42 𝑠 8192 2611⋆ 𝑠 293 𝑠 time/op ⋆ 43 min 31 sec Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 45/65
  67. 67. А если мы пойдем другим путем? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 46/65
  68. 68. Пример 2: JMH, -prof perfnorm, N=256 per multiplication per iteration CPI 1.06 cycles 146 × 106 8.7 instructions 137 × 106 8.2 L1-loads 68 × 106 4 L1-load-misses 33 × 106 2 L1-stores 0.56 × 106 L1-store-misses 38357 LLC-loads 26 × 106 1.6 LLC-stores 11595 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 47/65
  69. 69. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j] ; } R[i][j] = s; } } return result; } L1-dcache-load-misses Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
  70. 70. Пример 2: Very Hot Code public Matrix multiply(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int s = 0; for (int k = 0; k < size; k++) { s += A[i][k] * B[k][j] ; } R[i][j] = s; } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 48/65
  71. 71. Пример 2: Very Hot Code public Matrix multiplyIKJ(Matrix other) { int size = data.length; Matrix result = new Matrix(size); int [][] R = result.data; int [][] A = this.data; int [][] B = other.data; for (int i = 0; i < size; i++) { for (int k = 0; k < size; k++) { int aik = A[i][k]; for (int j = 0; j < size; j++) { R[i][j] += aik * B[k][j]; } } } return result; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 49/65
  72. 72. Пример 2: Very Hot Code IJK IKJ N multiply strassen multiply 32 33 𝜇𝑠 13 𝜇𝑠 64 252 𝜇𝑠 80 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠 2048 32 𝑠 6 𝑠 3.4 𝑠 4096 309 𝑠 42 𝑠 25 𝑠 8192 2611 𝑠 293 𝑠 210 𝑠 time/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
  73. 73. Пример 2: Very Hot Code IJK IKJ N multiply strassen multiply strassen 32 33 𝜇𝑠 13 𝜇𝑠 64 252 𝜇𝑠 80 𝜇𝑠 128 3019 𝜇𝑠 2119 𝜇𝑠 464 𝜇𝑠 256 32 𝑚𝑠 15 𝑚𝑠 4 𝑚𝑠 512 488 𝑚𝑠 111 𝑚𝑠 29 𝑚𝑠 25 𝑚𝑠 1024 3270 𝑚𝑠 785 𝑚𝑠 369 𝑚𝑠 192 𝑚𝑠 2048 32 𝑠 6 𝑠 3.4 𝑠 1.4 𝑠 4096 309 𝑠 42 𝑠 25 𝑠 10 𝑠 8192 2611 𝑠 293 𝑠 210 𝑠 73 𝑠 time/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 50/65
  74. 74. Пример 2: JMH, -prof perfnorm, N=256 IJK IKJ multiply iteration multiply iteration CPI 1.06 0.51 cycles 146 × 106 8.7 9.7 × 106 0.6 instructions 137 × 106 8.2 19 × 106 1.1 L1-loads 68 × 106 4 5.4 × 106 0.3 L1-load-misses 33 × 106 2 1.1 × 106 0.1 L1-stores 0.56 × 106 2.7 × 106 0.2 L1-store-misses 38357 8959 LLC-loads 26 × 106 1.6 0.3 × 106 LLC-stores 11595 3532 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 51/65
  75. 75. Пример 2: Дополнительные плюшки! cycles insts ... 6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore 9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc 0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx 0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge ... Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
  76. 76. Пример 2: Дополнительные плюшки! cycles insts ... 6.42% 5.54% 0x00007ff6591d20c5: vmovdqu %ymm1 ,0x10(%r14 ,%rbx ,4) ;* iastore 9.49% 11.91% 0x00007ff6591d20cc: add $0x8 ,%ebx ;*iinc 0.15% 0.05% 0x00007ff6591d20cf: cmp %r11d ,%ebx 0x00007ff6591d20d2: jl 0x00007ff6591d20b2 ;* if_icmpge ... Векторизация (SSE/AVX)! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 52/65
  77. 77. Пример третий «++ на оба ваши треда» Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 53/65
  78. 78. Пример 3: False Sharing @State(Scope.Group) public static class StateBaseline { int field0; int field1; } @Benchmark @Group("baseline") public int justDoIt(StateBaseline s) { return s.field0 ++; } @Benchmark @Group("baseline") public int doItFromOtherThread(StateBaseline s) { return s.field1 ++; } Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 54/65
  79. 79. Пример 3: измерим что общего sharing padded Same Core (HT) L1 9.5 4.9 Diff Cores (within socket) L3 (LLC) 10.6 2.8 Diff Sockets ничего 18.2 2.8 average time, ns/op Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 55/65
  80. 80. Пример 3: соберем HWC Данные нормализованы на 103 операций Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded CPI 1.3 0.7 1.4 0.4 1.7 0.4 cycles 33130 17536 36012 9163 46484 9608 instructions 26418 25865 26550 25747 26717 25768 L1-loads 12593 9467 9696 8973 9672 9016 L1-load-misses 10 5 12 4 33 3 L1-stores 4317 7838 7433 4069 6935 4074 L1-store-misses 5 2 161 2 55 1 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 56/65
  81. 81. Пример 3: соберем HWC (продолжение) Данные нормализованы на 103 операций Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded LLС-loads 4 3 58 1 32 1 LLC-load-misses 1 1 53 ≈0 35 ≈0 LLC-stores 1 1 183 ≈0 49 ≈0 LLC-store-misses 1 ≈0 182 ≈0 48 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 57/65
  82. 82. Пример 3: На честном слове и на одном ядре для одного ядра нам нужно считать MACHINE_CLEARS.MEMORY_ORDERING Same Core Diff Cores Diff Sockets sharing padded sharing padded sharing padded CPI 1.3 0.7 1.4 0.4 1.7 0.4 cycles 33130 17536 36012 9163 46484 9608 instructions 26418 25865 26550 25747 26717 25768 CLEARS 238 ≈0 ≈0 ≈0 ≈0 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 58/65
  83. 83. Пример 3: разные ядра L2_STORE_LOCK_RQSTS - L2 RFOs breakdown Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 LLC-stores 183 ≈0 49 ≈0 LLC-store-misses 182 ≈0 48 ≈0 L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0 L2_STORE_LOCK_RQSTS.HIT_E ≈0 ≈0 ≈0 ≈0 L2_STORE_LOCK_RQSTS.HIT_M ≈0 ≈0 ≈0 ≈0 L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 59/65
  84. 84. Внимание! Вопрос в зал! Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 60/65
  85. 85. Пример 3: разные ядра Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 LLC-stores 183 ≈0 49 ≈0 LLC-store-misses 182 ≈0 48 ≈0 L2_STORE_LOCK_RQSTS.MISS 134 ≈0 33 ≈0 L2_STORE_LOCK_RQSTS.ALL 183 ≈0 49 ≈0 Почему 183 > 49 и 134 > 33, а все равно работает быстрее? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 61/65
  86. 86. Пример 3: события считающие длительность Есть и такое событие: OFFCORE_REQUESTS_OUTSTANDING.CYCLES_WITH_DEMAND_RFO Diff Cores Diff Sockets sharing padded sharing padded CPI 1.4 0.4 1.7 0.4 cycles 36012 9163 46484 9608 instructions 26550 25747 26717 25768 ORO.SWD_RFO 21723 10 29601 56 Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 62/65
  87. 87. Заключение: Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 63/65
  88. 88. Заключение: Учиться, учиться и учиться! Изучаем микроархитектуру: ∙ “Computer Architecture: A Quantitative Approach” John L. Hennessy, David A. Patterson ∙ http://www.agner.org/optimize/ ∙ http://www.google.com/search?q=Hardware+ performance+counter Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 64/65
  89. 89. Q & A ? Copyright c○ 2015, Oracle and/or its affiliates. All rights reserved. 65/65

×