Умножение вектора с плавающей запятой на 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 снижает уровень точности, а не повышает его. Для большей точности, вы должны сделать вычисления на doubles (продвигая вектор к этому типу), затем, возможно, приведите результат обратно к float после этого. Инструкции, необходимые для конвертации: cvtps2pd (float в double) и / или cvtpd2ps (double в float). Они конвертируют только два значения за раз (так как только два doubleвписывается в регистр SSE), поэтому вам нужно будет выполнить преобразование в две части.

Другие вопросы по тегам