我必须使用sse / sse2实现矩阵向量乘法。 矢量和矩阵很大。 矩阵是双倍的,矢量是浮动的。
重点是我必须对浮点数进行的所有计算 - 当我从矩阵中获取数据时我将其提升为浮点数,进行计算并得到浮点向量(稍后在浮点数上进行一些额外的计算之后我必须添加一些浮点数值(浮点矩阵)为双值(双矩阵)。
我的问题是如何使用SSE / SSE2来做到这一点 - 问题是双打 - 我有指向双*的指针我必须以某种方式将4个双打转换成4个浮点数以适合__mm128 ...是否有任何入侵这样做?
答案 0 :(得分:1)
从double
更改为float
会降低精确度,而不是增加精度。为了更准确,您应该在double
s上进行计算(将向量提升为该类型),然后可能会将结果转发回float
。转换所需的说明是cvtps2pd
(float
至double
)和/或cvtpd2ps
(double
至float
)。那些只能一次转换两个值(因为只有两个double
适合SSE寄存器),所以你需要分两部分进行转换。
答案 1 :(得分:1)
您需要两次调用__m128 _mm_cvtpd_ps (__m128d a)
(CVTDP2PS
)以获得两个单精度浮点向量,每个向量包含两个原始双精度值,然后将这两个浮点向量合并为一个向量,例如__m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)
(SHUFPS
)。