Умножение вектора с плавающей запятой на sse/sse2
Я должен реализовать матрично-векторное умножение, используя sse / sse2. Вектор и матрица большие. Матрица двойная, вектор с плавающей точкой.
Дело в том, что все вычисления, которые я должен делать для чисел с плавающей запятой - когда я получаю данные из матрицы, я продвигаю их как плавающие, выполняю вычисления и получаю вектор с плавающей запятой (позже, после некоторых дополнительных вычислений с плавающей запятой, я должен добавить некоторые значения с плавающей запятой (float). матрица) удваивать значения (double matrix).
Мой вопрос заключается в том, как я могу сделать это, используя SSE/SSE2 - проблема с doubles - у меня есть указатель на double*, и мне нужно каким-то образом преобразовать 4 double в 4 float, чтобы вписаться в __mm128... Есть ли какие-либо меры, чтобы сделать это?
2 ответа
Вам нужно позвонить __m128 _mm_cvtpd_ps (__m128d a)
(CVTDP2PS
) дважды, чтобы получить два вектора с плавающей точкой одинарной точности, каждый из которых содержит два исходных значения двойной точности, затем объединить эти два вектора с плавающей точкой в один вектор, используя, например, __m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)
(SHUFPS
).
Изменение от double
в float
снижает уровень точности, а не повышает его. Для большей точности, вы должны сделать вычисления на double
s (продвигая вектор к этому типу), затем, возможно, приведите результат обратно к float
после этого. Инструкции, необходимые для конвертации: cvtps2pd
(float
в double
) и / или cvtpd2ps
(double
в float
). Они конвертируют только два значения за раз (так как только два double
вписывается в регистр SSE), поэтому вам нужно будет выполнить преобразование в две части.