Спекулятивне виконання

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Спекулятивне виконання — це метод оптимізації, коли комп'ютерна система виконує деякі завдання, які можуть бути насправді непотрібними. Основна ідея полягає в тому, щоб зробити роботу до того, як відомо, чи буде потрібна ця робота взагалі, з тим щоб запобігти затримці. Якщо зрештою з'ясовується, що робота була не потрібна, будь-які зміни скасовуються і результати ігноруються. Мета полягає в тому, щоб забезпечити більше параллелізму якщо додаткові ресурси доступні. Такий підхід використовується в різних областях, у тому числі прогнозування розгалуженняв конвеєрних процесорах упереджувальна вибірка пам'яті та файлів, і оптимістичне управління паралелізмом[en] у системах баз даних[ru][1][2][3].


Огляд[ред.ред. код]

Однією з головних особливостей шостого покоління мікропроцесорів архітектури IA32 є динамічне (спекулятивне) виконання. Під цим терміном мається на увазі наступна сукупність можливостей:

  • Глибоке пророкування розгалужень (з ймовірністю> 90 % можна передбачити 10-15 найближчих переходів).
  • Аналіз потоку даних (на 20-30 кроків вперед переглянути програму і визначити залежність команд за даними або ресурсів).
  • Випереджаючий виконання команд (МП P6 може виконувати команди в порядку, відмінному від їх проходження в програмі).

Сучасні конвеєрні мікропроцесори використовують спекулятивне виконання, щоб знизити вартість команд умовного переходу з використанням схем, що передбачають шлях виконання програми. З метою підвищення ефективності та використання ресурсів комп'ютера, інструкції можуть бути заплановані в той час, коли ще не була визначено, що інструкції повинні бути виконані[4]. У оптимізації компіляторів[en] для декількох систем обробки, спекулятивне виконання передбачає дозвільний процесор, що виконує код в наступному блоці процесора, якщо немає залежності від коду, який може бути запущений на інших процесорах. Перевага цієї схеми є скорочення часу відгуку для окремих процесорів і системи в цілому[5]. Компілятор обмежується видачею спекулятивної команди виконання, так як вона вимагає апаратного забезпечення за для буферизації[ru]. Без апаратної підтримки, компілятор може видати тільки спекулятивні інструкції, які не мають ніяких побічних ефектів у разі неправильної спекуляції[6].

Енергійне обчислення[ред.ред. код]

Енергійне обчислення[en]

Енергійне обчислення являє собою форму спекулятивного виконання, де виконуються обидві сторони умовної гілки; проте, результати відбуваються тільки якщо предикат є вірним. З необмеженими ресурсами, енергійне обчислення (також відоме як пророкування виконання) могло б забезпечити таку ж продуктивність що і пророкування переходів. З обмеженими ресурсами енергійне обчислення слід використовувати обережно, так як кількість необхідних ресурсів зростає з кожним етапом[7].

Передбачене виконання[ред.ред. код]

Передбачене виконання є формою спекулятивного виконання, де кілька результатів вже передбачені та виконання триває уздовж прогнозованої траєкторії до фактичного результату. Якщо передбачення вірно, то передбачене виконання дозволено зробити, проте якщо є невірне передбачення, виконання повторюється. Загальні форми цього включають передбачення переходів та передбачення залежності пам'яті[en].

Ліниві обчислення[ред.ред. код]

Докладніше: Ліниві обчислення

Перевагами лінивих обчислень є:

  • Можливість визначити потік керування як абстракції замість примітивів.
  • Можливість визначати потенційно нескінченні структури данних. Це дозволяє реалізовувати деякі алгоритми більш прямолінійно.
  • Покращення продуктивності за рахунок уникання непотрібних обчислень і невиконуваних гілок в умовних виразах.

Ліниві обчислення можуть привести до зменшення використання пам'яті, тому що значення створюються лише якщо вони потрібні. Проте ліниві обчислення важко об'єднувати з імперативним програмуванням, наприклад у випадку введення/виведення чи обробки виключних ситуацій, тому що порядок операцій стає невизначеним. Також ліниві обчислення можуть привести до витоків пам'яті.

Ліниві обчислення не спекулюють. Включення спекулятивного виконання в реалізації мови програмування Haskell є поточною темою дослідження. Haskell побудована навколо ідеї спекулятивного виконання.

Примітки[ред.ред. код]

  1. .Ліниве і спекулятивне виконання Батлер Лемпсон Microsoft Research OPODIS, Бордо, Франція 12 грудня 2006.
  2. International Business Machines Corporation. Відділ досліджень; Прабхакар Рагаван; Hadas Schachnai; Mira Янів (1998). Динамічні схеми для спекулятивного виконання коду. IBM. Перевірено 18 січня 2011 року
  3. Кунг, Г. Т.; Джон Т. Робінсон (червень 1981). «Про оптимістичних методів управління паралелізмом». ACM Trans. Syst бази даних.
  4. Бернд Krieg-Брюкнер (1992). ЕСОП '92: 4-й Європейський симпозіум з програмування, Ренні, Франція, 26-28 лютого 1992 року: провадження у справі. Springer. стр. 56-57. ISBN 978-3-540-55253-6. Перевірено 18 січня 2011 року
  5. Phillip A. Лапланте (2004). У режимі реального часу системи проектування та аналізу. Wiley-IEEE. р. 391. ISBN 978-0-471-22855-4. Перевірено 21 січня 2011 року
  6. David J. Ліля; Peter L. Bird (1 січня 1994 року). Взаємодія компіляції технологій і комп'ютерної архітектури. Springer. р. 16. ISBN 978-0-7923-9451-8. Перевірено 21 січня 2011 року
  7. Jurij Silc; Борут Robić; Тео Унгерер (1999). Архітектура процесора: від потоків даних, щоб суперскалярное і за її межами. Springer. стр. 148—150. ISBN 978-3-540-64798-0. Перевірено 21 січня 2011 року

Посилання[ред.ред. код]