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