рядів.
Команди зсуву реалізують логічний і арифметичний зсуви своїх операндів (арифметичний зсув відрізняється від логічного тим, що при зсуві вправо розряди, що звільнилися, заповнюються копією знакового розряду, а не нулями, від чого він придатний для множення/ділення знакових операндів на ступені двійки). Логічні порозрядні команди виконують операції І (AND), АБО (OR), АБО, що виключає (XOR), а також комбіновану команду І з інверсією одного з операндів (AND NOT), зручну для реалізації "зворотного вибору" по бітовій масці.
Команди порівняння працюють дещо незвичайно в порівнянні із загальноприйнятою логікою: замість установки ознак для подальших команд переходу вони генерують одиничні бітові маски для тих операндів, які задовольняють умові, і нульові – для решти операндів. Подальші логічні порозрядні операції можуть виділити, погасити або якось інакше обробити відзмічені таким чином операнди, які в цьому випадку можуть бути точками зображення або відліками звукового сигналу.
Серед нових команд є такі нестандартні операції, як додавання і віднімання з насиченням, упаковка, розпаковка, множення з додаванням, операції порівняння з утворенням маски результату. Використовуючи ці можливості, можна досягати ще більшого зростання продуктивності.
Розглянемо приклад, аналоги якому можна знайти в найрізноманітніших додатках. Припустимо, нам необхідно відтворити два звукові ефекти одночасно. Для цього необхідно побайтово скласти оцифровані значення звуку, і якщо результат "зашкалює" в ту чи іншу сторону, то обмежити його по амплітуді. На мові С+ фрагмент коду виглядатиме наступним чином sum = snd1 + snd2; if (sum > 127) sum = 127; if (sum < -128) sum = -128; Після компіляції ця ділянка коду перетвориться на 7 інструкцій процесора x86.
Якщо ж скористатися технологією MMX, то весь цей громіздкий код можна замінити однією-єдиною інструкцією paddsb mm0, mm1 яка до того ж виконає цю операцію відразу для пакету з 8 байтів даних. Неважко підрахувати, що для даного прикладу досягається прискорення виконання приблизно в 56 разів! Інший приклад, де інструкції MMX можуть дати значний виграш в продуктивності, – додавання двох зображень з використанням одного з кольорів в якості "прозорої" маска. Ця стандартна операція достатньо часто зустрічається в багатьох графічних додатках. Голубий колір фону довкола космічного корабля розглядається як прозорий при складанні зображень. Спеціальні інструкції порівняння з утворенням маски результату дозволяють виконати цю операцію не тільки пакетами по 8 байтів, але й уникнути галужень, а значить, і штрафів за їх неправильний прогноз. При цьому продуктивність при використанні процесора Pentium з технологією MMX зростає не менше, ніж у два рази.
Як існуючі додатки і існуюча операційна система зберігатимуть значення нові 8 регістрів MMX, наприклад, при перемиканні задач, якщо вони нічого про це не знають? Виявляється, регістри МMX суміщені по розташуванню з регістрами плаваючої точки. Завдяки такому рішенню регістри MMX повністю вписуються в існуючу архітектуру.
Особливості реалізації MMX
Для обробки даних і зберігання проміжних результатів в Pentium MMX використовуються вісім 64-розрядних регістрів MM0...MM7, які фізично суміщені зі стеком регістрів математичного співпроцесора. При виконанні будь-якої з MMX-команд відбувається установка "режиму MMX" з відміткою цього в слові стану співпроцесора (FPU Tag Word). З цієї миті стек регістрів співпроцесора розглядається як набір MMX-регістрів; завершує роботу в режимі MMX команда EMMS (End MultiMedia State). З одного боку, така реалізація дозволила забезпечити нормальну роботу додатків, використовуючих MMX, в багатозадачних системах, що не підтримують цю технологію, оскільки всі подібні системи створюють власну копію вмісту стека співпроцесора і слова його стану для кожного процесу. З другого боку, перехід між режимами займає значний час, і поєднання, наприклад, в одному циклі команд співпроцесора з командами MMX може не тільки не прискорити, а навіть істотно сповільнити виконання програми. Тому для досягнення найкращих результатів рекомендується групувати ці команди окремо одна від одної, що насправді не представляє ніякої складності.
Продуктивність MMX
Оскільки MMX – достатньо вузькоспеціалізоване розширення системи команд процесора, не можна чекати кардинального прискорення роботи тільки від самого факту переходу на процесор MMX. Як вже було сказано, на додатках загального характеру, "незнайомих" з MMX, реальна продуктивність зростає лише на одиниці відсотків, хоча тести можуть показувати її зростання на 20-30% – це відбувається через циклічність більшості тестів, коли велика частина циклу потрапляє в збільшений внутрішній кеш.
При використанні "чистого" MMX-коду, вдало придатного до специфіки вирішуваної задачі, швидкодія переписаної ділянки може зрости в 5-6 разів, проте це прискорення буде локальним і неминуче компенсується "типовими" ділянками програми, тому не слід зразу ж чекати від програм, використовуючих MMX, прискорення роботи в рази. По максимальних результатах тестів Intel Media Benchmark і Norton Media Benchmark для Windows 95, обробка зображень з використанням технології MMX відбувається швидше майже в п'ять разів, проте в середньому виходить приблизно 1,5...3-кратне прискорення.
Для порівняння продуктивності процесорів Pentium MMX, Pentium Pro і Pentium II застосовується індекс iCOMP® Index 2.0 (Intel Comparative Microprocessor Performance). Визначення iCOMP проводиться тільки самою фірмою Intel і лише для своїх процесорів.
Таблиця 2.
Індекси продуктивності iCOMP Index 2.0
Процесор | iCOMP Index 2.0 | Процесор | iCOMP Index 2.0
Pentium 75MHz | 67 | Pentium MMX 166 MHz | 160
Pentium 90 MHz | 81 | Pentium MMX 200 MHz | 182
Pentium 100 MHz | 90 | Pentium MMX 233 MHz | 203
Pentium 120 MHz | 100 | Pentium Pro 180 MHz | 197
Pentium 133 MHz | 111 | Pentium® Pro 200 MHz | 220
Pentium 150