【问题标题】:sse/sse2 double matrix float vector multiplicationsse/sse2 双矩阵浮点向量乘法
【发布时间】:2011-07-05 14:12:39
【问题描述】:

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

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

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

【问题讨论】:

  • 当然你应该反过来做,即将你的浮点向量值加倍并以双精度进行计算,否则为什么首先要在矩阵中使用双精度?
  • 好吧,没人理解——我正在研究神经网络,双打矩阵是神经网络权重。当我学习我的神经网络时,我计算的权重变化非常小 - 如果权重是浮动的,那么将非常小的浮点值添加到另一个浮点数会导致精度下降 - 当我将非常小的浮点值添加到双倍时,我不会' t 松散的精度。当然,我可以在双打上做所有事情,但这不是必需的 - 浮点操作更快。
  • 好吧,我的错 - 你是对的 - 双打会更快更好:)

标签: vector matrix sse sse2


【解决方案1】:

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

【讨论】:

  • _mm_shuffle_ps 在这种情况下效率低下,我建议使用_mm_movelh_ps_mm_movehl_ps 来组合两个“高”和“低”向量。
  • @LiraNuna 在英特尔芯片上,它们的速度相同,1 个周期延迟/1 个周期吞吐量。但在 Jaguar 等较老的 AMD 上,shufps 比 movlhps 或 movhlps 快 4 倍。
【解决方案2】:

double 更改为float 是在降低精度水平,而不是提高它。为了更准确,您应该在doubles 上进行计算(将向量提升为该类型),然后可能将结果转换回float。转换所需的说明是 cvtps2pdfloatdouble)和/或 cvtpd2psdoublefloat)。它们一次只能转换两个值(因为只有两个 doubles 适合 SSE 寄存器),因此您需要分两部分进行转换。

【讨论】:

  • 1.关键是我在计算过程中不需要双精度 - 我只在存储结果时才需要它。
  • 2.如何使用此转换在一个 __mm128 中获得 4 个浮点数?据我了解,该指令将 [0..63] 位设置为 2 个浮点值,并将 [64 127] 位设置为 0。经过两次此类操作后,我将获得 2 个 __m128,每个具有 2 个浮点数。我想到的唯一一件事是在 __m128 之一中交换 hi 和 low qword,然后在逻辑上与它们在一个 __m128 中获得 4 个浮点数......你知道更好的解决方案吗?
  • 查看movhlpsmovlhps 的数据移动。
  • 用双精度存储单精度计算的结果有什么意义?
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2017-03-11
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多