我需要每秒运行矩阵向量乘法240000次。矩阵为5x5,并且总是相同的,而向量在每次迭代时都会发生变化。数据类型为float。我正在考虑使用一些SSE (或类似的)指令。
发布于 2011-07-07 22:17:04
发布于 2013-03-17 16:59:44
原则上,SSE的加速率可达4倍(AVX为8倍)。让我解释一下。
让我们调用固定的5x5矩阵M。将5D向量的分量定义为(x,y,z,w,t)。现在从前四个向量形成一个5x4矩阵U。
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倍的加速比。
发布于 2011-07-07 22:23:01
我建议使用Intel,并抽象自己对技术的依赖。
https://stackoverflow.com/questions/6617688
复制相似问题