Пожалуй самый лучший софт в мире можно найти именно тут и это не
пустые слова… |
|
MMX, 3DNow!,
SSE и все, все, все…
(Я не являюсь профессионалом в этой области, тут описано моё личное мнение. Строго не судите.)
Вообще-то, я в интернете много читал про эти технологии, про их достоинства и недостатки. Это вполне естественно, так как они существуют уже давно. Ну и начнем с истории:
Самая первая SIMD технология, внедренная Intel’ом в далеких 90-ых. В своё время сделала мощный прорыв в
компьютерной индустрии. Без особых затрат (для ее работы использовался
сопроцессор) была получена возможность производить операции над 64-разрядами за
один такт. Эта технология работает только с целыми числами и поэтому важнейшим
ее недостатком является то, что может работать либо MMX команда, либо команда с плавающей
точкой (т.к. за работу с вещественными числами отвечает сопроцессор и он же
отвечает за MMX). И
поэтому нужно использовать команду переключения.
3DNow!
Как сказали многие: «Рекламный трюк!» или «Ответный удар АМД». Итак, что мы видим. Эта технология является логическим продолжением MMX’а. Т.е. те же 64 бита, только добавлена поддержка чисел с плавающей точкой. Когда я взглянул в описание инструкций, то был просто в ужасе. Во-первых, что-нибудь типа mm(dest)[63:32] = mm/m64(src)[31:0] + mm/m64(src)[63:32] выглядит несколько пугающе и непонятно зачем оно вообще нужно, когда можно сделать проще. Во-вторых, я не нашел деления!!! Конечно извините, но без деления никуда… а так по жизни вполне достаточно команд MMX’а.
Не помню что появилось раньше, но скорее всего ССЕ, как ответ на 3DNow!. Новая технология, новые регистры. Теперь поддержка 128 разрядов. В наличии все логические функции, а также все арифметические действия и даже деление(правда 32-ух разрядных вещественных чисел)!!!
Ну как говорится «Зуб за зуб». Правда… все те же регистры MMX, все те же 64 разряда,
опять нет деления чисел с плавающей точкой. Зато понадобавлялась целая куча
бесполезных команд, в смысл которых вникнуть стало еще труднее: mm(dest)[15:0] =
abs(mm(dest)[7:0] - mm/m64(src)[7:0]) + abs(mm(dest)[15:8] - mm/m64(src)[15:8])
+ abs(mm(dest)[23:16] - mm/m64(src)[23:16]) + abs(mm(dest)[31:24] -
mm/m64(src)[31:24]) + abs(mm(dest)[39:32] - mm/m64(src)[39:32]) +
abs(mm(dest)[47:40] - mm/m64(src)[47:40]) + abs(mm(dest)[55:48] - mm/m64(src)[55:48])
+ abs(mm(dest)[63:56] - mm/m64(src)[63:56])
И опять работает
сопроцессор :)
Вышел новый
процессор… ну и в качестве рекламы был расширен ССЕ до ССЕ2. Новые инструкции и
ничего более(хотя полезные и во многих случаях более быстрые: пересылка сразу
128 бит как пример… только данные в памяти должны быть выравнены на 16).
***
Используя программу CPU Technology Test мной были получены результаты
повергшие меня в ужас: ни одна SIMD технология не давала
значительного преимущества при вычислении простейшего дискретного выражения.
После чего я усомнился в необходимости этих технологий и решил усложнить задачу
– сделал тест для решения арифметического выражения с двумя делениями и одним
умножением. И о чудо!!! Скорость выполнения с использованием SSE2 была почти в 4 раза выше.
В общем немного
поразмыслив, я пришел к такому выводу: использовать SIMD технологии нет никакой необходимости, если надо произвести элементарное
действие (хоть и над большим количеством данных), а вот если надо высчитать
сложное алгебраическое выражение, где несколько делений и умножений, то вперед
и выше.
Еще хотелось бы
отметить тот факт, что процессоры от Intel очень медленно производят
арифметические операции (деление и умножение). В этом случае поможет SSE2.
Сравнение
процессоров Intel и AMD