В последнее время я довольно часто использовал инструкции x86 SIMD (SSE1234) в форме встроенных функций. Что меня огорчило, так это то, что в SSE ISA есть несколько простых инструкций, которые доступны только для чисел с плавающей запятой или только для целых чисел, но теоретически должны выполняться одинаково для обоих. Например, как плавающие, так и двойные векторы имеют инструкции для загрузки старших 64 бит 128-битного вектора с адреса ( movhps , movhpd ), но такой инструкции для целочисленных векторов нет.
Мой вопрос:
Есть ли причины ожидать снижения производительности при использовании инструкций с плавающей запятой для целочисленных векторов, например, используя movhps для загрузки данных в целочисленный вектор?
Я написал несколько тестов, чтобы проверить это, но я полагаю, что их результаты не заслуживают доверия. Действительно трудно написать правильный тест, который бы исследовал все возможные варианты для таких вещей, особенно когда планирование команд, скорее всего, здесь задействовано.
Похожие вопросы:
Другие тривиально похожие вещи также имеют несколько инструкций, которые делают в основном то же самое. Например, я могу сделать побитовое ИЛИ с por , orps или orpd . Может кто-нибудь объяснить, какова цель этих дополнительных инструкций? Я думаю, это может быть связано с различными алгоритмами планирования, применяемыми к каждой инструкции.