Я читаю руководство по встроенным функциям Intel при реализации поддержки SIMD. У меня есть несколько путаницы, и мои вопросы, как показано ниже.
__m128 _mm_cmpeq_ps (__m128 a, __m128 b)
Документация говорит, что она используется для сравнения упакованных плавающих точек одинарной точности. Что значит «упакованный»? Нужно ли мне как-то упаковать мои значения с плавающей запятой, прежде чем я смогу их использовать?
Для двойной точности есть такие встроенные функции, как _mm_cmpeq_sd
Это означает, что нужно сравнивать «более низкие» элементы с плавающей запятой двойной точности. Что означает нижний и верхний элементы двойной точности? Могу ли я использовать их для сравнения вектора C ++ double
типа элементов или нет? Или мне нужно каким-то образом их обработать, прежде чем сравнивать?
В SSE 128-битные регистры могут быть представлены как 4 элемента по 32 бита.
SSE определяет два типа операций; скалярная и упакованная. Скалярная операция работает только с наименее значимым элементом данных (бит 0 ~ 31), а упакованная операция вычисляет все четыре элемента параллельно.
_mm_cmpeq_sd
будет сравнивать только наименее значимый элемент данных (первые 32 бита) из двух операндов, в то время как _mm_cmpeq_ps
будет сравнивать каждую группу из 32 битов параллельно.
Если вы используете 64-битную двойную, вы можете упаковать двойную пару, чтобы использовать 128-битное пространство. Сюда, _mm_cmpeq_ps
будет в состоянии сделать два сравнения 4 двойных параллельно.
Если вы хотите сделать только одно сравнение за один раз, ты можешь использовать _mm_cmpeq_pd
сравнить два 64-битных двойных.
Обратите внимание, что _mm_cmpeq_pd
SSE2 пока _mm_cmpeq_ps
это SSE.
В этом контексте «упакованный» означает «несколько одинаковых типов, помещенных в один кусок», то есть «упакованный с плавающей запятой одинарной точности» означает 4 * 32-битные числа с плавающей запятой, сохраненные как 128-битное значение.
Вам либо нужно «упаковать» каждое значение в регистр, используя различные PACK*
инструкции или данные уже «упакованы» в память, например, массив (кратный) 4 значений с плавающей запятой [которые выровнены соответствующим образом].
Скаляр означает «одно значение» в нижнем n
биты регистра (например, double
будет 64 младшими битами 128-битного регистра SSE).