Я пытаюсь узнать больше о том, как работают SSE / SSE2: я знаю, что SSE / SSE2 используют регистры mmx размером 128 бит (16 байт), и что обычно эти регистры имеют 4 ячейки с плавающей запятой, где я могу хранить свои поплавки, упаковывая их , Прежде чем получить результат, я должен «распаковать их».
Мой вопрос: так как я новичок, зачем мне упаковывать эти значения в регистры xmm и зачем мне их распаковывать? В чем преимущество?
Вы не должны упаковать / распаковать их. Если числа уже имеют правильный формат, вы просто используете подходящую инструкцию перемещения для загрузки их в регистр или операнд памяти для использования содержимого памяти в качестве второго операнда для сложения, вычитания и т. Д.
Иногда случается так, что данные не попадают в нужное место из расчета, чтобы идти туда, куда нужно, и именно здесь пригодятся различные инструкции по упаковке и распаковке.
Скажем, например, что вы делаете некоторые математические 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
значения, мы могли бы просто сохранить новые значения в соответствующие им слоты в массиве без упаковки / распаковки значений.
Потому что эти регистры являются вводом / выводом для инструкций SSE.