_mm_load_ps против _mm_load_pd против и т.д. на Intel x86 ISA

Какая разница между двумя строками?

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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