W punkcie tym opisane są instrukcje nie tylko mmx-owe, ale także charakterystyczne
dla pentiumów wszelkiego rodzaju.
Instrukcje mmx w ogólności zaliczamy do instrukcji typu SIMD (Simple instruction
multiple data) to znaczy że ta sama instrukcja wykonuje się na większej ilości danych.
Zgodnie z głosami na pl.comp.os.linux instrukcje te są nieprzydatne i niewykorzystywane.
Pozwolę sobie z tym nie zgodzić. Jeżeli w programie nie operujesz na liczbach zmiennoprzecinkowych,
tzn. nie korzystasz z instrukcji koprocesora, wtedy z powodzeniem możesz użyć instrukcji
mmx-owych i zwiększyć prędkość programu.
Spotkałem się na sieci z biblioteką umożliwiającą wykorzystywanie instrukcji mmx w programach
w C, ale użycie tej biblioteki znacząco spowalnia program. Łatwiej więc samemu umieścić
odpowiedni kod w swoim programie.
Przy instrukcjach mmx pojawia się pojęcie "saturated" czyli "nasycenia" liczby.
Po polsku lepiej brzmi "zaokrąglanie" wyników i to dobrze oddaje o co chodzi.
Po prostu wyniki niektórych operacji są automatycznie zaokrąglane do najbliższej
liczby, tzn. 0xff+0x01 będzie równe dalej 0xff a nie 0x00 (zakładając że rozmair typu
wynosi właśnie 0xff).
Instrukcje mmx operują na liczbach 64-bitowych! Przy czym liczby te można traktować
albo jako zwykłe integery o bardzo dużym zakresie, albo jako dwie liczby
32-bitowe, cztery 16-bitowe lub osiem 8-bitowych. I tak np. instrukcja
paddb spowoduje równoczesne dodanie ośmiu liczb.
Imponujące nieprawdaż? Idealnie nadaje się to do operacji graficznych.
8-bitowa liczba, to nic innego jak kolor punktu w trybie 256 kolorów. Dodanie
do tabeli 8-bitowych liczb można zinterpretować jako operację graficzną na kolorach.
Osiem razy, teoretycznie szybszą, niż bez instrukcji mmx.
Aby wykryć, czy nasz procesor potrafi wykorzystać programy z instrukcjami mmx możemy
wykorzystać instrukcję cpuid, która pojawiła się wraz z pentium, tak jak to widać
w poniższym przykłądzie:
a[0]=10,b[0]=10 a[1]=11,b[1]=12 a[2]=12,b[2]=14 a[3]=13,b[3]=16 a[4]=14,b[4]=18 a[5]=15,b[5]=20 a[6]=16,b[6]=22 a[7]=17,b[7]=24