Я видел названия некоторых инструкций, которые мы добавили в SSE, однако нет объяснения по всем из них (может быть, SSE4? Они даже не перечислены в Википедии). Где я могу прочитать о том, что они делают?
Лучшим источником будут люди, разработавшие расширения: Intel. Конкретными ссылками являются Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 ; Я бы порекомендовал вам скачать комбинированные тома с 1 по 3C (первая ссылка для скачивания на этой странице). Вы можете посмотреть на Vol. 1, Ch. 12
- Программирование с SSE3, SSSE3, SSE4 и AESNI. Чтобы обратиться к конкретным инструкциям, см. Vol. 2, Ch. 3-4
(Приложение B также полезно)
Как я узнаю, какие из этих инструкций используются?
Инструкции используются только в том случае, если программа, которую вы запускаете, фактически использует их (т.е. вызывается байт-код, соответствующий различным инструкциям SSE4). Чтобы узнать, какие инструкции использует программа, вам нужно использовать дизассемблер.
Если мы знаем, какие из них используются, допустим, я делаю сравнение (это может быть самый глупый вопрос, который я когда-либо задавал, хотя я не знаю о сборке) Возможно напрямую использовать инструкцию для код сборки? (Я смотрю на это:http://asm.inightmare.org/opcodelst/index.php?op=CMP)
Как процессор интерпретирует инструкции?
Возможно, вы захотите взглянуть на мой ответ на вопрос:« Как процессор" знает ", что на самом деле означают команды и инструкции?». Когда вы пишете ассемблерный код вручную, чтобы сделать исполняемый файл, вы передаете ассемблерный "читаемый человеком" ассемблерный код, который превращает инструкции в фактические 0 и 1, которые выполняет процессор.
Что произойдет, если у меня есть процессор без каких-либо инструкций SSE? (Полагаю, что если мы захотим провести сравнение, мы не сможем, верно?)
Поскольку ваш компьютер завершен по Тьюрингу, он может выполнять любую произвольную математическую функцию, используя программный алгоритм, если у него нет выделенного оборудования для этого. Очевидно, что интенсивная параллельная или матричная математика в аппаратном обеспечении намного быстрее, чем в программном обеспечении (требует много циклов инструкций), поэтому это может привести к замедлению работы конечного пользователя. В зависимости от того, как была создана программа, возможно, что для нее может потребоваться определенная инструкция (т. Е. Из набора SSE4), хотя, учитывая, что в программном обеспечении можно делать то же самое (и, следовательно, использовать его на большем количестве процессоров), такая практика встречается редко. ,
В качестве примера вышесказанного вы можете вспомнить, когда процессоры впервые выпустили расширение набора команд MMX. Допустим, мы хотим добавить два 8-элементных 8-битных вектора со знаком (так, чтобы каждый вектор был 64-битным, равным одному регистру MMX), или, другими словами, A + B = C
Это можно сделать с помощью одной инструкции MMX, которая называется paddsb
. Для краткости, скажем, наши векторы также хранятся в ячейках памяти A
, B
и C
Наш эквивалентный код сборки будет:
movq MM0, [A]
paddsb MM0, [B]
movq [C], MM0
Тем не менее, эта операция также может быть легко выполнена в программном обеспечении. Например, следующий код C выполняет эквивалентную операцию (поскольку char
имеет ширину 8 бит):
#define LEN 8
char A[LEN], B[LEN], C[LEN];
/* Code to initialize vectors A and B... */
for (i = 0; i < LEN; i++)
{
C[i] = A[i] + B[i];
}
Вы, вероятно, можете догадаться, как будет выглядеть ассемблерный код вышеприведенного цикла, но ясно, что он будет содержать значительно больше инструкций (так как теперь нам нужен цикл для обработки добавления векторов), и, таким образом, нам нужно будет выполнить гораздо больше выбирает. Это похоже на то, как длина слова процессора влияет на производительность компьютера (целью MMX/SSEx является предоставление обоих больших регистров, а также возможность выполнять одну и ту же инструкцию для нескольких фрагментов данных).