Получаю ли я снижение производительности при смешивании инструкций SSE integer / float SIMD

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

Мой вопрос:

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

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

Связанный вопрос:

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

17
задан starblue 16 February 2011 в 21:16
поделиться