Програмне кешування

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Доповідь
На тему: Програмне кешування

Зміст
1. Введення.
2. Програмна предвибірки в процесорах К6 + і РIII +.
3. Предвибірки в процесорах AMD К6 і VIA C3.
4. Предвибірки в процесорах РIIIі Р4.
5. Pentium III.
6. Pentium 4.
7. Ефективність передвибірки в багатозадачних системах.

Введення
Програмного керування кешуванням просто не пощастило. Концепція "прозорого" кеша, активно просувається фірмою Intel, абстрагувався програмістів від потреб апаратної реалізації кеш-контролера і не надала їм жодних важелів управління останнім. Втім, для досягнення повної абстракції інтелектуальності кеш-контролерів все ж таки не вистачило, і для системних програмістів довелося крихітну лазівку, дозволивши їм, зокрема, забороняти кешування сторінок пам'яті, що належать периферійних пристроїв.
До тих пір, поки більшість додатків перемелювало компактні, багаторазово оброблювані структури даних, стратегія завантаження кеш-лінійок на першу вимогу цілком справлялася зі своїм завданням, але з появою мультимедійних додатків стала "буксувати". Різко зрослий обсяг оброблюваних даних і поширення потокових алгоритмів, що звертаються до кожної комірки пам'яті лише одного разу, обернувся постійними перезавантаженнями кешу, що обмежило продуктивність системи не швидкодією процесора, а пропускною здатністю оперативної пам'яті. Вперше цієї проблеми кинула виклик фірма AMD, включивши до складу набору команд 3D Now! посібник divfetch, що дозволяє програмістові завчасно завантажувати в кеш комірки пам'яті, до яких він розраховує звернеться в найближчому майбутньому. Причому завантаження даних здійснюється без участі і зупинки обчислювального конвеєра! Це вбиває двох зайців відразу: по-перше, ручне управління кеш-контролером дозволяє вибрати оптимальну стратегію упереджувальної завантаження даних, що істотно зменшує кількість кеш-промахів, а, по-друге, з предвибірки стає можливим завантажувати чергову порцію даних паралельно з обробкою попередньої, маскуючи тим самим латентність оперативної пам'яті.
Слідом за К6, предвибірки (природно в удосконаленому варіанті) з'явилася і в Pentium lll, та не одна, а з цілою свитою команд ручного управління кешуванням - Intel явно не хотіла відставати від конкурентів!
Удосконалення управління підсистемні пам'яті продовжилося і в Pentium 4. Крім розширення набору команд, в ньому реалізований унікальний на сьогоднішній день механізм апаратної передвибірки з інтелектуальним алгоритмом упереджувальної завантаження. Аналізуючи порядок, в якому додаток запрошує дані з оперативної пам'яті, процесор намагається передбачити (приблизно так само, як пророкує напрямок умовних переходів) адреса наступної оброблюваної осередку, щоб спекулятивно завантажити її в кеш задовго до реального зажадання. Природно, при всій прозорості апаратної передвибірки структури даних бажано зробити так, щоб процесор рідше помилявся у своїх прогнозах, а в ідеалі - не помилявся взагалі.

Програмна предвибірки в процесорах К6 + і Р III +
Підтримка програмної передвибірки є як в К6/К7 (і сумісному з К6 мікропроцесорі VIA C3), так і в Р! / Р4, однак, їх реалізації різні і до того ж не сумісні один з одним. Процесори від AMD (VIA) не розуміють інструкцій передвибірки процесорів Intel і, відповідно, навпаки.
Ця сумна обставина істотно знижує популярність передвибірки, оскільки програмістам доводиться або писати два варіанти коду: один для Intel, інший для AMD (VIA); або обмежувати аудиторію користувачів одним з процесорів.
Тому до предвибірки доцільно вдаватися лише в дійсно крайніх випадках, коли ніякими іншими шляхами забезпечити необхідну швидкодію вже не вдається.
Предвибірки в процесорах AMD К6 і VIA C3
У К6/К7 і VIA C3 програмна предвибірки здійснюється однією з двох інструкцій: divfetch або divfetchw. Буква w в кінці останньої повідомляє процесору, що завантажувані дані планується модифікувати. Це аж ніяк не означає, що дані, які за допомогою divfetch, модифіковані не можна. Модифікувати їх можна, але не бажано, тому що в цьому випадку процесор змушений здійснювати додатковий цикл, змінюючи атрибути відповідної кеш-лінійки з ексклюзивною на модифікується.
Інструкція divfetch просто ініціює запит комірки пам'яті, точно також, як це робить будь-яка команда, яка звертається до пам'яті, але, на відміну від останньої, divfetch не поміщає завантажувані дані ні в якій регістр, більше того, вона взагалі не чекає кінця завантаження цих даних, тут же повертаючи управління. Передчасне завершення ініціатора запиту ще не звільняє кеш-контролер від обов'язку виконання цього запиту, але якщо запитана осередок вже знаходиться в кеші першого рівня, нічого не відбувається і інструкція divfetch веде себе аналогічно команді NOP (немає операції). В іншому випадку кеш-контролер звертається до кеша другого рівня, а якщо шуканої осередку не виявляється і там - до оперативної пам'яті (кешу третього рівня), цілком заповнюючи відповідні кеш-рядки кешей всіх нижчих рівнів. Оскільки кеш-контролер працює незалежно від обчислювального конвеєра процесора, предвибірки дозволяє завантажувати чергову порцію даних паралельно з обробкою попередньої. Якщо час завантаження даних не перевищує часу їх обробки, то простою процесора взагалі не відбувається - обчислювальних конвеєр працює без упину, а час доступу до пам'яті повністю маскується.
Інструкція divfetchw працює аналогічно divfetch, але автоматично присвоює завантажується осередку статус модифікується. Якщо рядок дійсно планується модифіковані, це економить 15-25 тактів процесорного часу. Однак, якщо ви не впевнені, чи буде рядок змінюється, краще завантажте її як ексклюзивну, т. к. вивантаження модифікується, але реально не модифікованої рядки в оперативну пам'ять обійдеться набагато дорожче.
Модифікуються ж кеш-строки незалежно від того, чи були вони реально модифіковані чи ні, завжди витісняються в оперативну пам'ять або кеш вищого рівня, що вимагає певної кількості тактів процесора.
Незважаючи на те, що AMD позиціонує команди передвибірки як апаратно-незалежні, вони такими не є, оскільки кількість байт, що завантажуються інструкціями divfetch і divfetchw, визначаються розмірами кеш-ліній процесора, а їх довжина різна: 32 байти для AMD K6 (VIA C3) і 64 байта для Athlon / Duron. Відповідно, різні оптимальний крок і мінімальна дистанція передвибірки.
У цьому світлі стає дуже цікавим наступне висловлювання AMD, почерпнуте з керівництва з оптимізації під Athlon: "Інструкції PREFETCHNTA/T0/T1/T2 з ММХ-розширення апаратно залежні. Якщо ви, пане розробник, потребуєте сумісності з 25 мільйонами вже проданих процесорів AMD -K6-2 і AMD-K6-III, замість інструкцій передвибірки нового розширення ММХ, користуйтеся командами PREFETCH / W з розширення 3Dnow! "
Ось хороша демонстрація мистецтва умовчання! Якщо вже кидати камінь у город Intel, то не зайве б відзначити, що, по-перше, і власні інструкції передвибірки апаратно-залежні, а, по-друге, процесорами Pentium вони воно не підтримуються. Так що ніяких переваг в AMD `шної передвибірки перед Intel немає.
Предвибірки в процесорах Р! і Р4
У процесорах Р! і Р4 програмна предвибірки здійснюється наступними інструкціями: divfetchnta, divfetcht0, divfetcht1, divfetcht2. Суфікс вказує на тип даних, що завантажуються, що визначає рівень кеш-ієрархії, в яку ці дані будуть завантажені. Так NTA розшифровується як Non-TemporAl [Data] - не тимчасові дані, тобто дані, багаторазове використання яких планується. Відповідно Т0, Т1, Т2 позначає тимчасові дані, використовувати які планується неодноразово.
Який би командою предвибірки ні здійснювалася, кеш-лінійкам, завантажується з основної пам'яті, завжди присвоюється ексклюзивний статус. При предвибірки лінійок з кеша другого рівня їх колишній статус зберігається. Можливість завантаження кеш-лінійки з автоматичною установкою статусу модифікується в процесорах Pentium не реалізована. Однак з огляду на багатоступінчастої схеми буферизації запису, зміна атрибутів кеш-лінійок відбувається в основному, а не в додатковому, як у К6/Athlon, циклі обміну, тобто без шкоди для продуктивності.
Причому на відміну отdivfetch / w, інструкції divfetchnta/t0/t1/t2 не наказують, а рекомендують здійснити предвибірки. Процесор відхиляє рекомендацію і не здійснює предвибірки, якщо:
· Запитані дані вже містяться в кеші відповідною або найближчій до процесора ієрархії;
· Відомості про сторінку, до якої належать завантажувані дані, відсутні в DTLB (Data Translation Look aside Buffer - Буфері асоціативної Трансляції;)
· Підсистема пам'яті процесора зайнята переміщенням даних між L1-і L2-кешем;
· Запитані дані належать регіону некешіруемой пам'яті (сторінці з атрибутами UC та USWC);
· Дані не можуть бути завантажені з-за помилки доступу (при цьому виключення не виробляється);
· Інструкція передвибірки передує префіксом LOCK (у цьому випадку генерується виключення "невірний опкод");
Під c інших випадках предвибірки виконується. Алгоритм її виконання апаратно-залежний і сильно варіюється від однієї моделі процесора до іншої, тому, поведінка "передвиборчих" команд на Р! і Р4 нижче ми розглянемо окремо

Pentium lll

Інструкція divfetchnta завантажує дані в кеш першого рівня, минаючи другий. Дійсно, дані, повторне звернення до яких не планується, доцільно поміщати в кеш найближчою до процесора ієрархії, не затираючи вміст інших, тому що воно може ще стане в нагоді, а ось одноразово використовувані дані після їх витіснення з L1-кеша, з L2-кеша затребувані вже точно не будуть. Інструкція divfetcht0 завантажує дані в кеш-ієрархії обох рівнів. Дані, звернення до яких відбувається багаторазово, будучи завантаженими в L2-кеш, опиняться як не можна до речі, коли будуть витіснені з L1-кешу.
Інструкції divfetcht1 і divfetcht2 завантажують дані в один лише кеш другого рівня, не поміщаючи їх в кеш першого. Оскільки вивантаження буферів запису відбувається в кеш другого рівня, минаючи перший, то предвибірки відповідних лінійок в L1-кеш здійснювати недоцільно. Ось тут-то і стане в нагоді divfetcht1/t2!
Розмір завантажуваних даних дорівнює довжині кеш-лінійок відповідної кеш-ієрархії і становлять 32 байти (в Plll і L2-, і L1-кеш мають лінійки по 32 байти).

 

Pentium 4

Жодна з команд передвибірки Р4 не дозволяє завантажувати дані в кеш першого рівня. Всі - і тимчасові, і не тимчасові дані містяться лише в кеш другого рівня - творці процесора вирішили вчинити саме так. Ефективність такої стратегії не безперечна, але в будь-якому випадку час доступу до кеша другого рівня набагато менше часу доступу до оперативної пам'яті, тому навіть така предвибірки значно краще, ніж нічого.
Виникає питання: якщо всі команди передвибірки поміщають завантажувані дані в кеш другого рівня, то яка між ними різниця? Між командами divfetcht0, divfetcht1 і divfetcht2 - дійсно ніякої. А ось команда divfetchnta відрізняється тим, що поміщає завантажувані дані не в будь-який, а виключно в перший банк кеша другого рівня (восьми-асоціативний L2-кеш Р4 містить вісім таких банків), завдяки чому divfetchnta ніколи не витісняє більше 1 / 8 обсягу кеша другого рівня. Одноразово використовувані дані, як вже говорилося вище, дійсно не повинні витісняти багаторазово використовувані дані з верхніх кеш-ієрархій, але в Р4 таке витіснення все-таки відбувається, і запобігти його, на жаль, не можна. Причому витісняються аж ніяк не ті осередки, до яких довше всього не було звернень, а лінійки фіксованого банку, можливо інтенсивно використовуються обробному їх додатком! Словом, у Р4 програмна предвибірки реалізована далеко не найкращим чином.
Розмір завантажуваних даних дорівнює довжині лінійок кеша другого рівня, що становить 128 байт.
Відмінності в реалізації передвибірки на Р! і Р4 істотно ускладнюють оптимізацію додатків, оскільки кожен процесор вимагає до себе індивідуального підходу. Для досягнення максимальної ефективності всі критичні процедури рекомендується реалізовувати як мінімум у двох варіантах - окремо для Р! і окремо для Р4. В іншому випадку, або Р! надзвичайно гальмувати, або Р4 не розкриє справжнього потенціалу своєї продуктивності. З огляду на існування К6/Athlon, варіантів реалізації набирається вже чотири. Чи не занадто багато головного болю для програмістів? Ні, це зовсім не заклик до відмови від передвибірки - адже програмісти, як і комсомольці, легкими шляхами не розпещені.
Ефективність передвибірки в багатозадачних системах
Процеси, яка крутиться в багатозадачних системах, володіють кеш-пам'яттю не одноосібно, а змушені ділити її між собою? Знижує це ефективність передвибірки? Ефективність передвибірки в кеш першого рівня - однозначно ні. Проміжок часу між перемиканнями завдань - це ціла вічність для процесора, який відповідає, щонайменше, мільйонам тактів. У будь-якому випадку, незалежно від того, чи буде витіснено вміст L1-кеша чи ні, - предвибірки дозволяє конвейерізіровать завантаження даних з пам'яті, запобігаючи тим самим можливе падіння продуктивності.
З L2-кешем ситуація не така однозначна. Якщо оптимізується алгоритм дозволяє распараллеліть завантаження даних з їх обробкою, то стан L2-кеша взагалі не грає ніякої ролі, оскільки швидкодію програми обмежується саме швидкістю обчислень, а не пропускною здатністю підсистемні пам'яті. Проте якщо час обробки даних менше часу їх завантаження з основної пам'яті, падіння продуктивності ніяк не уникнути. Предвибірки, звичайно, збільшить продуктивність програми і в цьому випадку, але, на жаль, ненабагато - максимум на два-три рази.
З іншого боку, одночасне виконання двох або більше додатків, інтенсивно обмінюються з пам'яттю, на робочих станціях трапляється дуже рідко (для серверів, правда, це - норма життя). У більшості випадків користувач активно працює лише з одним додатком, інші ж перебувають у фоні і задовольняються мінімальною кількістю пам'яті, а часом і зовсім «сплять», не чіпаючи L2-кеш і практично не знижуючи ефективності передвибірки.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Доповідь
27.6кб. | скачати


Схожі роботи:
Програмне забезпечення ПК Cистемне програмне забезпечення
Програмне забезпечення
Програмне забезпечення ПК
Програмне забезпечення
Програмне забезпечення ПК 2
Системне програмне забезпечення
Апаратне і програмне забезпечення
Програмне генерування РВП0 1
Програмне генерування РВП 0 1
© Усі права захищені
написати до нас