Теорія:
Почнемо з цього: сьогодні центральні процесори є суперскалярними, що означає, що вони можуть виконувати більше однієї інструкції за цикл (IPC). Найновіші архітектури Intel можуть мати до 4 IPC (4 декодери інструкцій x86). Не будемо вносити в обговорення макро / мікро синтез, щоб ще більше ускладнити ситуацію :).
Як правило, робоче навантаження не досягає IPC = 4 через різні обмеження ресурсів. Це означає, що центральний процесор витрачає цикли (кількість інструкцій дається програмним забезпеченням, і центральний процесор повинен виконувати їх за якомога менше циклів).
Ми можемо розділити загальний цикл, витрачений процесором, на 3 категорії:
- Цикли, коли інструкції припиняють роботу (корисна робота)
- Цикли, що проводяться в Back-End (марно)
- Цикли, проведені в Front-End (даремно).
Щоб отримати IPC 4, кількість циклів, що виходять із системи, повинна бути близькою до загальної кількості циклів. Майте на увазі, що на цьому етапі всі мікрооперації (uOps) виходять із конвеєру та фіксують свої результати в регістрах / кешах. На цьому етапі у вас може вийти навіть більше 4 uOps, оскільки це число визначається кількістю портів виконання. Якщо у вас є лише 25% циклів, які припиняють 4 uOps, тоді у вас буде загальний IPC 1.
У циклах Тупик в фоновому є відходами , тому що процесор повинен чекати ресурсів ( як правило , пам'ять) або закінчити довгі затримки команд (наприклад , transcedentals - SQRT, зворотні, підрозділ і т.д.).
У циклах Тупик в передньому кінці є відходами , оскільки це означає , що Front-End не мав Back End з мікрооперацій. Це може означати, що у вас є пропуски в кеші інструкцій або складні інструкції, які ще не розшифровані в кеші мікро-операції. Складений своєчасно код зазвичай виражає таку поведінку.
Ще однією причиною стійла є прогнозування гілок. Це називається поганою спекуляцією. У цьому випадку видаються uOps, але вони відкидаються, оскільки BP прогнозував помилку.
Реалізація в профілях:
Як ви трактуєте зупинені цикли BE та FE?
Різні профілі мають різні підходи до цих показників. У vTune категорії від 1 до 3 складаються, щоб отримати 100% циклів. Це здається розумним, тому що або у вас заблокований центральний процесор (жоден uOps не виходить на пенсію), або він виконує корисну роботу (uOps) на пенсію. Детальніше див. Тут: https://software.intel.com/sites/products/documentation/doclib/stdxe/2013SP1/amplifierxe/snb/index.htm
У перфі це зазвичай не відбувається. Це проблема, тому що коли ви бачите, що 125% циклів застопорилось у передній частині , ви не знаєте, як насправді це інтерпретувати. Ви можете пов’язати показник> 1 з тим, що існує 4 декодери, але якщо продовжити міркування, то IPC не збігатиметься.
Ще краще, ви не знаєте, наскільки велика проблема. 125% з чого? Що тоді означають #cycles?
Я особисто виглядаю трохи підозріло щодо зупинених циклів BE та FE, і сподіваюся, це буде виправлено.
Можливо, остаточну відповідь ми отримаємо шляхом налагодження коду звідси: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-stat.c