Упаковка и распаковка данных для инструкций SSE / SSE2?

Я пытаюсь узнать больше о том, как работают SSE / SSE2: я знаю, что SSE / SSE2 используют регистры mmx размером 128 бит (16 байт), и что обычно эти регистры имеют 4 ячейки с плавающей запятой, где я могу хранить свои поплавки, упаковывая их , Прежде чем получить результат, я должен «распаковать их».

Мой вопрос: так как я новичок, зачем мне упаковывать эти значения в регистры xmm и зачем мне их распаковывать? В чем преимущество?

2

Решение

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

Иногда случается так, что данные не попадают в нужное место из расчета, чтобы идти туда, куда нужно, и именно здесь пригодятся различные инструкции по упаковке и распаковке.

Скажем, например, что вы делаете некоторые математические 3D-графики на этом

struct coord { float X, Y, Z, W; };

Но чтобы сделать расчет эффективным, мы загружаем четыре из этих структур одновременно, с X из всех четырех в одном регистре, Y из всех четырех в другом регистре и т. д. Теперь, после того как мы, например, умножили все X, Y, Z а также W значения [четыре за один раз] с матрицей преобразования для масштабирования / поворота объекта, нам нужно сохранить его обратно как X, Y, Z и W снова, что делается путем «распаковки» соответствующих элементов обратно в их соответствующие X, Y, Z, W отдельные записи.

Конечно, если вместо того, чтобы массив coord значения, вы сохранили четыре массива X, Y, Z а также W значения, мы могли бы просто сохранить новые значения в соответствующие им слоты в массиве без упаковки / распаковки значений.

6

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

Потому что эти регистры являются вводом / выводом для инструкций SSE.

0

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