6

Итак, я читал о том, как работают процессоры. Теперь я нахожусь на инструкции (SSE, SSE2 и т.д.) Материал. (Что довольно интересно).

У меня много вопросов (я читал эту статью в Википедии):

  1. Я видел названия некоторых инструкций, которые были добавлены в SSE, однако нет объяснения ни по одной из них (может быть, SSE4? Они даже не перечислены в Википедии). Где я могу прочитать о том, что они делают?

  2. Как мне узнать, какие из этих инструкций используются?

  3. Если мы знаем, какие из них используются, допустим, я делаю сравнение (возможно, это самый глупый вопрос, который я когда-либо задавал, хотя я не знаю, как это сделать). Можно ли напрямую использовать инструкцию? на ассемблерный код? (Я смотрю на это: http://asm.inightmare.org/opcodelst/index.php?op=CMP)

  4. Как процессор интерпретирует инструкции?

  5. Что бы произошло, если бы у меня был процессор без каких-либо инструкций SSE? (Полагаю, в случае, если мы хотим провести сравнение, мы не сможем, верно?)

4 ответа4

11

Я видел названия некоторых инструкций, которые мы добавили в 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 является предоставление обоих больших регистров, а также возможность выполнять одну и ту же инструкцию для нескольких фрагментов данных).

2

Отвечать вам в том же порядке, что и вопросы:

  1. Самый простой способ - зайти на сайт Intel и загрузить технические документы. Event eh Manual SDK Manual будет содержать все необходимые детали. Вот одна из таких ссылок. Вот еще одна ссылка на мнемонику и пояснения SSE Instruction Set.
  2. Что именно вы имеете в виду, какие из этих инструкций используются? Вы ищете информацию о вашем процессоре или конкретном приложении?
    Что касается процессоров, я не знаю о Windows, но в Linux вы просто читаете флаги процессора. Проще сделать это с помощью команды # lshw .
    С другой стороны, для конкретного приложения, я не совсем уверен, вы всегда можете разобрать исполняемый файл и проверить используемые инструкции. Поскольку большинство приложений предназначены для массовой аудитории, они будут использовать только общий набор инструкций x86. Чтобы использовать более специфичные для процессора инструкции, вы должны вручную скомпилировать приложение в вашей системе.
  3. Вы всегда можете запустить симулятор. Если вы хотите использовать ассемблерный код в своих проектах программирования, вы можете сделать это на C и C++. Я использовал только код ASM внутри C, поэтому не знаю, поддерживает ли его какой-либо другой язык. Для получения справки по использованию встроенного ASM, обратитесь к этому вопросу SO .
  4. Этот вопрос в значительной степени лежит в области компьютерной архитектуры. Хотя я мог бы объяснить это здесь, это будет нелегко. Был еще один вопрос SU, который касался этой темы.
  5. Чтобы ответить на ваш конкретный вопрос, набор инструкций SSE появился только в 1999 году, в то время как инструкции CMP существовали еще с тех пор. Это было частью Инструкции в 8080 году тоже. В любом случае, поскольку наши машины являются Turing-Complete, микропроцессоры более старых версий могут выполнять сравнения. Только было сложнее сделать их без явной инструкции. Каждый набор инструкций - это только более быстрый, простой и оптимизированный способ выполнения определенных инструкций, он едва добавляет новые функциональные возможности, поскольку машина Turing-Complete всегда может compute everything that is computable
1

Если мы знаем, какие из них используются, допустим, я делаю сравнение (возможно, это самый глупый вопрос, который я когда-либо задавал, хотя я не знаю, как это сделать). Можно ли напрямую использовать инструкцию? на ассемблерный код? (Я смотрю на это: http://asm.inightmare.org/opcodelst/index.php?op=CMP)

Сборка - это просто читабельная версия машинного кода. Имена, которые вы видите, являются мнемоникой для инструкции, используемой в сборке, поэтому, конечно, она всегда использовалась непосредственно в сборке.

Что бы произошло, если бы у меня был процессор без каких-либо инструкций SSE? (Полагаю, в случае, если мы хотим провести сравнение, мы не сможем, верно?)

Если процессор видит недопустимую инструкцию / код операции, это вызовет исключение. Обычно ОС просто объявляет об ошибке, а затем завершает программу. Но при необходимости программное обеспечение или ОС могут перехватить исключение и обработать инструкцию в программном обеспечении. Это приведет к крайне неэффективному из-за изменения состояния между программой и обработчиком исключений, но программа может работать без изменений.

Это использовалось на этапе, когда в CPU не было встроенного FPU, и математические вычисления с плавающей точкой обрабатывались в отдельном сопроцессоре. В этом случае, если к ПК не подключен сопроцессор, то инструкции с плавающей запятой вызовут исключение, а дескриптор исключения вычислит операцию с помощью программного обеспечения перед передачей их обратно в программу.

Он также использовался некоторыми исправлениями Hackintosh для запуска MacOS X (для которого требуется SSE2/3 или более) на старых процессорах

0

Отвечаю только на 5-й вопрос. Предположим, вы запускаете машинный код на полусовместимом компьютере. Таким образом, процессор может в конечном итоге перейти к неверной инструкции.

Существует протокол, которому совместно следуют современные ОС и процессоры, чтобы справиться с такими ситуациями. Процессор хранит информацию о том, что только что произошло, и переходит к коду ОС для помощи, поэтому ОС способна правильно оценить ситуацию и, скорее всего, убьет введенный в заблуждение процесс (т.е. удалит процесс из своей очереди готовности и перезапустит связанные структуры данных).

В системах UNIX недопустимая инструкция соответствует SIGILL, сигналу, для которого процесс мог зарегистрировать подпрограмму обработчика сигнала. Если это так, он не уничтожается, и вместо этого вызывается соответствующий обработчик сигнала. В противном случае дамп ядра записывается на диск. Вы можете прочитать об этом в signal(7) или в Rochkind, "Расширенное программирование в UNIX", глава 9.1.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .