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

Я читаю руководство по встроенным функциям Intel при реализации поддержки SIMD. У меня есть несколько путаницы, и мои вопросы, как показано ниже.

  1. __m128 _mm_cmpeq_ps (__m128 a, __m128 b) Документация говорит, что она используется для сравнения упакованных плавающих точек одинарной точности. Что значит «упакованный»? Нужно ли мне как-то упаковать мои значения с плавающей запятой, прежде чем я смогу их использовать?

  2. Для двойной точности есть такие встроенные функции, как _mm_cmpeq_sd Это означает, что нужно сравнивать «более низкие» элементы с плавающей запятой двойной точности. Что означает нижний и верхний элементы двойной точности? Могу ли я использовать их для сравнения вектора C ++ double типа элементов или нет? Или мне нужно каким-то образом их обработать, прежде чем сравнивать?

15

Решение

В 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.

20

Другие решения

В этом контексте «упакованный» означает «несколько одинаковых типов, помещенных в один кусок», то есть «упакованный с плавающей запятой одинарной точности» означает 4 * 32-битные числа с плавающей запятой, сохраненные как 128-битное значение.

Вам либо нужно «упаковать» каждое значение в регистр, используя различные PACK* инструкции или данные уже «упакованы» в память, например, массив (кратный) 4 значений с плавающей запятой [которые выровнены соответствующим образом].

Скаляр означает «одно значение» в нижнем n биты регистра (например, double будет 64 младшими битами 128-битного регистра SSE).

9

По вопросам рекламы [email protected]