2

我必须使用 sse/sse2 实现矩阵向量乘法。向量和矩阵很大。矩阵是双精度的,向量是浮点数。

关键是我必须对浮点数进行所有计算 - 当我从矩阵获取数据时,我将其提升为浮点数,进行计算并获得浮点向量(稍后在对浮点数进行一些额外计算之后,我必须添加一些浮点值(浮点数)矩阵)到双值(双矩阵)。

我的问题是如何使用 SSE/SSE2 来做到这一点 - 问题在于双精度 - 我有指向 double* 的指针,我必须以某种方式将 4 个双精度转换为 4 个浮点以适应 __mm128 ... ?

4

2 回答 2

1

doubleto更改float是降低精度水平,而不是提高精度。为了更准确,您应该对doubles 进行计算(将向量提升为该类型),然后可能将结果转换回float之后。转换所需的指令是cvtps2pd( floatto double) 和/或cvtpd2ps( doubleto float)。那些一次只转换两个值(因为只有两个doubles 适合 SSE 寄存器),因此您需要分两部分进行转换。

于 2011-02-28T08:07:47.237 回答
1

您需要调用__m128 _mm_cvtpd_ps (__m128d a)( ) 两次以获得两个单精度浮点向量,每个向量包含两个原始双精度值,然后使用例如( )CVTDP2PS将这两个浮点向量合并为一个向量。__m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)SHUFPS

于 2011-02-28T15:08:07.230 回答