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

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

Спекулятивне виконання — це метод оптимізації, коли комп'ютерна система виконує деякі завдання, які можуть бути насправді непотрібними. Основна ідея полягає в тому, щоб виконати роботу до того, як стане відомо, чи буде потрібна ця робота взагалі, з тим щоб запобігти затримці. Якщо зрештою з'ясовується, що робота була не потрібна, будь-які зміни скасовуються і результати ігноруються.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Lazy and Speculative Execution Butler Lampson Microsoft Research OPODIS, Bordeaux, France 12 December 2006
  2. International Business Machines Corporation. Research Division; Prabhakar Raghavan; Hadas Schachnai; Mira Yaniv (1998). Dynamic schemes for speculative execution of code. IBM. Процитовано 18 January 2011. 
  3. Kung, H. T.; John T. Robinson (June 1981). On optimistic methods for concurrency control. ACM Trans. Database Syst. 6 (2). 
  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 року

Див. також[ред. | ред. код]

  • Meltdown та Spectre — оприлюднені на початку 2018 року уразливості в сучасних мікропроцесорах з технологією спекулятивного виконання команд

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