Получу ли я снижение производительности при смешивании инструкций SSE integer / float SIMD - PullRequest
17 голосов
/ 14 февраля 2011

В последнее время я довольно часто использовал инструкции x86 SIMD (SSE1234) в форме встроенных функций. Что меня огорчило, так это то, что в SSE ISA есть несколько простых инструкций, которые доступны только для чисел с плавающей запятой или только для целых чисел, но теоретически должны выполняться одинаково для обоих. Например, как плавающие, так и двойные векторы имеют инструкции для загрузки старших 64 бит 128-битного вектора с адреса ( movhps , movhpd ), но такой инструкции для целочисленных векторов нет.

Мой вопрос:

Есть ли причины ожидать снижения производительности при использовании инструкций с плавающей запятой для целочисленных векторов, например, используя movhps для загрузки данных в целочисленный вектор?

Я написал несколько тестов, чтобы проверить это, но я полагаю, что их результаты не заслуживают доверия. Действительно трудно написать правильный тест, который бы исследовал все возможные варианты для таких вещей, особенно когда планирование команд, скорее всего, здесь задействовано.

Похожие вопросы:

Другие тривиально похожие вещи также имеют несколько инструкций, которые делают в основном то же самое. Например, я могу сделать побитовое ИЛИ с por , orps или orpd . Может кто-нибудь объяснить, какова цель этих дополнительных инструкций? Я думаю, это может быть связано с различными алгоритмами планирования, применяемыми к каждой инструкции.

1 Ответ

25 голосов
/ 15 февраля 2011

От эксперта (очевидно, не от меня: P): http://www.agner.org/optimize/optimizing_assembly.pdf [13.2 Использование векторных инструкций с другими типами данных, для которых они не предназначены (стр. 118-119)]:

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

Processor                       Bypass delay, clock cycles 
  Intel Core 2 and earlier        1 
  Intel Nehalem                   2 
  Intel Sandy Bridge and later    0-1 
  Intel Atom                      0 
  AMD                             2 
  VIA Nano                        2-3 
Table 13.2. Data bypass delays between integer and floating point execution units 
...