_mm_load_ps против _mm_load_pd против и т. д. на Intel x86 ISA - PullRequest
16 голосов
/ 13 января 2012

В чем разница между следующими двумя строками?

__m128 x = _mm_load_ps((float *) ptr);
__m128 y = _mm_load_pd((double *)ptr);

Другими словами, почему существует так много разных _mm_load_xyz инструкций вместо общих __m128 _mm_load(const void *)?

Ответы [ 2 ]

15 голосов
/ 13 января 2012

Существуют разные свойства, потому что они соответствуют разным инструкциям.

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

Один из способов думать об этом состоит в том, что разные инструкции выполняют «одно и то же», но дополнительно дают подсказку процессору, сообщая ему, как загружаемые данные будут использоваться в будущих инструкциях. Это может помочь процессору убедиться, что данные находятся в правильном месте для максимально эффективного использования, или процессор может игнорировать их.

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

4 голосов
/ 13 января 2012

_mm_load_ps загружает 4 значения с плавающей запятой одинарной точности

_mm_load_pd загружает 2 значения с плавающей запятой двойной точности

Это разные вещи, поэтому я думаю, что имеет смысл иметь разныефункции.Кроме того, в C нет перегрузки.

...