Раніше я писав багато асемблерів. Не просто компілятори покращилися, це те, що в більшості апаратних засобів зараз багато логіки, присвяченої виконанню коду поза замовленням. Справжня мікропрограма - це планування, більшість інструкцій на комп’ютері займають декілька машинних годин, щоб отримати результат - а завантаження пам'яті, яке пропускає кеш, може зайняти кілька сотень! Тому ідея полягала в тому, щоб запланувати інші вказівки, щоб зробити щось корисне, а не чекати результату. А сучасні машини можуть видавати кілька інструкцій за годинний період. Після того, як ми почали отримувати HW із виконання замовлень, я виявив, що намагання досягти великої продуктивності при ручному кодуванні стала грою гуртків. По-перше, HW поза замовленням не виконає інструкції у вашому ретельно складеному порядку, нова модна архітектура HW зменшила штраф за неоптимальне планування програмного забезпечення достатньо, щоб компілятор зазвичай був у межах кількох відсотків від вашої продуктивності. Також я з'ясував, що компілятори зараз реалізують відомі, але складності, що створюють хитрощі, такі як розкрутка, завантаження знизу, конвеєрне програмне забезпечення тощо. Підсумок, вам доведеться працювати дуже важко, пропускайте деякі з цих хитрощів, і компілятор б'є вас. Використовуйте їх усі, а кількість інструкцій асемблера вам потрібно збільшити в кілька разів!
Мабуть, навіть важливіше, більшість питань щодо продуктивності стосуються не швидкості випуску інструкцій, а отримання даних у процесор. Як я вже згадував вище, затримка пам’яті зараз становить сотні циклів, і процесор може виконувати кілька інструкцій за тактовий період, тому, якщо програма - і особливо структури даних не розроблені таким чином, щоб швидкість удару кешу була надзвичайно високою, мікроналаштування за інструкцією рівень не матиме окупності. Так само, як кажуть військові типи, любителі говорять про тактику розмов, профі - логістика розмов. Програмування продуктивності зараз становить понад 90% логістики (переміщення даних). І це важко підрахувати, оскільки сучасне управління пам’яттю, як правило, має кілька рівнів кешу, а сторінки віртуальної пам’яті обробляються апаратним блоком, який називається TLB. Також вирівнювання адрес на низькому рівні стає важливим, оскільки фактична передача даних не відбувається в одиницях байтів, або навіть 64-бітні довгі, але вони надходять у одиницях кеш-рядків. Тоді більшість сучасних машин мають апаратне забезпечення, яке намагається передбачити, який рядок кешу пропущений вам може знадобитися найближчим часом, і випускає автоматичні попередні вибори, щоб ввести їх у кеш. Тож реальність така, що з сучасними процесорними процесорами моделі настільки складні, що майже не зрозумілі. Навіть детальний апаратний симулятор ніколи не може відповідати точній логіці мікросхем, тому точна настройка вже неможлива.
Ще є місце для кодування вручну. Математичні бібліотеки (як, наприклад, функція exp), як і більш важливі операції лінійної алгебри (як множення матриці), як правило, вручну кодуються експертами, які працюють для постачальника обладнання (наприклад, Intel або AMD або IBM), але вони, ймовірно, тільки потрібна пара найвищих програмістів асемблера на мегакомп'ютерний корпус.