首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SSE加速浮点5x5矩阵*向量乘法

用SSE加速浮点5x5矩阵*向量乘法
EN

Stack Overflow用户
提问于 2011-07-07 22:04:27
回答 8查看 9.8K关注 0票数 13

我需要每秒运行矩阵向量乘法240000次。矩阵为5x5,并且总是相同的,而向量在每次迭代时都会发生变化。数据类型为float。我正在考虑使用一些SSE (或类似的)指令。

  1. I担心算术操作的数量与所涉及的内存操作的数量相比太小。你认为我能得到一些有形的(例如> 20%)的improvement?
  2. Do吗?我需要英特尔编译器来做?
  3. 你能指出一些参考吗?
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-07-07 22:17:04

向量,矩阵的Eigen C++模板库,两者都有

用于小固定大小矩阵的ones)

  • optimised

  • 优化代码(以及使用SSE优化

的动态大小的

  • 代码)

所以你应该试试。

票数 9
EN

Stack Overflow用户

发布于 2013-03-17 16:59:44

原则上,SSE的加速率可达4倍(AVX为8倍)。让我解释一下。

让我们调用固定的5x5矩阵M。将5D向量的分量定义为(x,y,z,w,t)。现在从前四个向量形成一个5x4矩阵U

代码语言:javascript
复制
U =
xxxx
yyyy
zzzz
wwww
tttt

接下来,执行矩阵积MU = V。矩阵V包含M的乘积和前四个向量。唯一的问题是,对于SSE,我们需要在xyzwtxyzwtxyzwtxyzwt U的行中读取,但是在内存中U存储为,所以我们必须将其转换为xxxxyyyyzzzzwwwwtttt.这可以在SSE中通过混合/混合来实现。一旦我们有了这种格式,矩阵乘积是非常有效的。

与使用标量代码的O(5x5x4)操作不同,它只需要O(5x5)操作,即4x加速。对于AVX,矩阵U将是5x8,因此它不是采用O(5x5x8)操作,而是只对O(5x5)征税,即8x加速。

然而,矩阵xxxxyyyyzzzzwwwwtttt V将是xyzwtxyzwtxyzwtxyzwt格式,因此根据应用程序的不同,它可能必须转换为xyzwtxyzwtxyzwtxyzwt格式。

对接下来的四个向量重复此操作(AVX为8个),等等,直到完成。

如果您控制了向量,例如,如果应用程序动态地生成向量,那么您可以以xxxxyyyyzzzzwwwwtttt格式生成它们,并避免数组的转置。在这种情况下,你应该得到一个4倍的速度与SSE和8倍的AVX。如果将此与线程处理(例如OpenMP )结合起来,则使用SSE的加速比应该接近16倍(假设有四个物理核)。我想这是你对SSE所能做的最好的了。

编辑:由于指令级并行性(ILP),在加速比中可以得到另一个2的因子,因此SSE的加速比可以在四个核(64×AVX)下达到32倍,与哈斯韦尔( FMA3 )再一次得到2倍的加速比。

票数 5
EN

Stack Overflow用户

发布于 2011-07-07 22:23:01

我建议使用Intel,并抽象自己对技术的依赖。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6617688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档