умножение вектора с плавающей запятой на sse / sse2 - PullRequest
2 голосов
/ 28 февраля 2011

Я должен реализовать умножение матрицы на вектор, используя sse / sse2.Вектор и матрица большие.Матрица двойная, вектор с плавающей точкой.

Дело в том, что все вычисления, которые я должен делать с плавающей точкой - когда я получаю данные из матрицы, я продвигаю их как плавающие, выполняю вычисления и получаю вектор с плавающей точкой (позженекоторые дополнительные вычисления для чисел с плавающей точкой Я должен добавить некоторые значения с плавающей точкой (матрица с плавающей точкой) к двойным значениям (двойная матрица).

Мой вопрос заключается в том, как я могу сделать это с помощью SSE / SSE2 - проблема с двойными - яесть указатель на double *, и мне нужно каким-то образом преобразовать 4 двойных в 4 числа с плавающей запятой, чтобы уместиться в __mm128 ... Есть ли какие-либо указания для этого?

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Вам нужно вызвать __m128 _mm_cvtpd_ps (__m128d a) (CVTDP2PS) дважды, чтобы получить два вектора с плавающей точкой одинарной точности, каждый из которых содержит два ваших исходных значения двойной точности, а затем объединить эти два вектора с плавающей точкой в ​​один вектор, используя, например, __m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8) (SHUFPS).

1 голос
/ 28 февраля 2011

Изменение с double на float снижает уровень точности, а не повышает его. Для большей точности вы должны выполнить вычисления на double с (переводя вектор в этот тип), а затем, возможно, затем привести результат обратно к float. Инструкции, необходимые для преобразования: cvtps2pd (float в double) и / или cvtpd2ps (double в float) Они преобразуют только два значения за раз (поскольку только два double вписываются в регистр SSE), поэтому вам нужно будет выполнить преобразование в двух частях.

...