3DNow!

3DNow! са специални SIMD инструкции, създадени от AMD за техните процесори. Тези инструкции разширяват MMX инструкциите, добавяйки възможност за обработка на числа с плаваща запетая. 3DNow! инструкциите са част от процесорната архитектура x86.

В края на 90-те години на 20 век AMD има голям проблем – техния процесор K6, който е с отлична целочислена производителност, изостава значително от процесорите на Intel по отношение на скоростта на работа с числа с плаваща запетая. Проблемът не е нов за AMD, но в предишните години това е без голямо значение, тъй като 99% от програмите използват само целочислени инструкции. С навлизането на първите 3D компютърни игри и възпроизвеждането на звукозаписи и видео на персоналните компютри обаче, значението на блока за изчисления с плаваща запетая рязко нараства.

Всъщност анализите показват, че блока за изчисления с плаваща запетая на K6 е дори по-бърз от този на основния му конкурент Pentium II, но не използва конвейер и в резултат успява да завърши по-малко инструкции на такт от конвейерния блок на Pentium II. Така или иначе, K6 е по-бавен и AMD вземат решение да добавят нови SIMD инструкции към процесорната архитектура x86, които да позволяват паралелната обработка на 2 числа с плаваща запетая наведнъж. Резултатът от тази инициатива са 3DNow! инструкциите. Те са подобни на MMX (дори използват същите регистри), но боравещи и с числа с плаваща запетая.

Първият процесор, който поддържа 3DNow! e пуснатият на 28 май 1998 процесор K6-2. Скоро след това се появяват и няколко приложения, които демонстрират ефекта от 3DNow! инструкциите. Повечето производители на софтуер не бързат да добавят поддръжка на 3DNow! към своите продукти, поради ниския пазарен дял на AMD.

Почти година по-късно Intel въведе подобен (но по-разширен и несъвместим с 3DNow!) набор от SIMD инструкции, наречени SSE. SSE инструкциите позволяват едновременната обработка на до 4 числа с плаваща запетая наведнъж.

В процесорите K6-2+, K6-III и първите Athlon, AMD добави още 19 инструкции за предварително зареждане на данни и др. подобни. Разширеният по този начин набор от инструкции получи името Enhanced 3DNow! (наричани още Extended 3DNow! и 3DNow+). С процесора Athlon XP, AMD въведе третото поколение SIMD инструкции, наречени 3DNow! Professional, като единствената съществена разлика е поддръжката на SSE инструкциите на Intel.

В крайна сметка 3DNow! инструкциите загубиха битката с SSE и се поддържат само от процесорите на AMD и VIA и от години не са били добавяни нови инструкции към тях. Като се добави факта, че AMD процесорите вече поддържат и SSE, бъдещето на 3DNow! изглежда мрачно. В последните няколко поколения AMD процесори вече няма поддръжка на 3DNow инструкции, въпреки че флаговете за тяхното присъствие са вдигнати.

3DNow! инструкциите добавят следните разширения към MMX инструкциите:

  • 1 тип данни.
  • 21 инструкции (плюс още инструкции в Enhanced 3DNow!).

Единственият нови тип данни, който е въведен от 3DNow! инструкциите са 2 32-битови числа с плаваща запетая, които са пакетирани в един 64-битов MMX/3DNow! регистър. Форматът на двете 32-битови числа е идентичен с този на число с плаваща запетая с единична точност на x87 инструкциите. Въпреки това, 3DNow! не е напълно съвместим със стандарта IEEE 754, защото има само един метод за закръгляне на резултата, не може да представя ненормализирани числа и не поддържа софтуерни изключения при операции с числата.

Обхватът на числата в 3DNow! инструкциите е от 2-126 (прибл. 1.17×10-38) до 2127 * (2 – 2-23) (прибл. 3.40×1038). При изчисленията с тези числа се прилага насищане, подобно на това при MMX инструкциите. Ако след закръглянето резултата е по-голям от максимално представимото положително или отрицателно число, то той се привежда до съответното максимално представимо число. Ако след закръглянето резултата е по-малък от най-малкото представимо число, то той се привежда към нула.

Имената на повечето 3DNow! инструкции започват PF. 3DNow! инструкциите могат да се разделят на няколко групи. Инструкциите, които са налични само в Enhanced 3DNow! са отбелязани по съответния начин в текста. Някои от инструкциите липсват от последните версии на официалната документация на AMD, но се поддържат и в най-новите процесори на компанията за обратна съвместимост.

Инструкции за преобразуване

[редактиране | редактиране на кода]
  • PF2ID – преобразува 2 пакетирани числа с плаваща запетая в 2 пакетирани 32-битови цели числа.
  • PI2FD – преобразува 2 пакетирани 32-битови цели числа в 2 пакетирани числа с плаваща запетая.
  • PF2IW – преобразува 2 пакетирани числа с плаваща запетая в 2 16-битови цели числа със знак, които се разширяват в две пакетирани 32-битови цели числа със знак (налична само в Enhanced 3DNow!).
  • PI2FW – подобна на PF2ID, но резултата са 2 пакетирани 16-битови цели числа, а в битове от 63 до 48 и от 31 до 16 на резултата има нули (налична само в Enhanced 3DNow!).
  • PSWAPD – прехвърля 2 пакетирани 32-битови цели числа в MMX регистър, като разменя младшите 32 бита със старшите 32 бита (налична само в Enhanced 3DNow!).