在Java中使用NIO浮点缓冲区进行快速4x4矩阵乘法运算

问题描述:

我知道存在很多这样的问题,但是我找不到特定于我的情况的问题。我将4x4矩阵实现为NIO浮点缓冲区(这些矩阵用于OpenGL)。现在我想实现与矩阵B和结果存储在矩阵相乘C.矩阵的乘法方法,因此,代码可能看起来像这样:在Java中使用NIO浮点缓冲区进行快速4x4矩阵乘法运算

class Matrix4f 
{ 
    private FloatBuffer buffer = FloatBuffer.allocate(16); 

    public Matrix4f multiply(Matrix4f matrix2, Matrix4f result) 
    { 
     {{{result = this * matrix2}}} <-- I need this code 

     return result; 
    } 
} 

什么是最快的代码来执行此乘法?一些OpenGL实现(像Android中的OpenGL ES东西)提供了本地代码,但其他OpenGL实现则不提供。所以我想为这些实现提供一个通用的乘法方法。

真正的答案当然是测试不同的实现并检查哪一个是最快的。

我的猜测是,没有测试,就是因为矩阵太小,用手扩展循环会产生最快的代码。例如。像

result[0][0] = this[0][0] * matrix2[0][0] + this[0][1] * matrix2[1][0] 
      + this[0][2] * matrix2[2][0] + this[0][3] * matrix2[3][0]; 
result[0][1] = // ... and so forth 

或那么也许只是展开内部循环,并保留两个最外面节省一些打字,以及I $。

+0

请注意,JIT编译器非常擅长在必要时展开循环,因此您可能会发现其中没有太多内容。 – 2010-05-09 17:35:32

如果支持该操作,请通过FloatBuffer.array()。然后只需通过该数组执行必要的乘法运算,然后返回得到的矩阵。

看看GameDev.net - Matrix Math的确切计算。

如果您想进一步优化,可以试用 Strassens Algorithm。你甚至不需要去填充你的矩阵,因为它们是正方形的,其大小是2的幂。

+1

正如Strassen的*文章所说:“Strassen算法的实际实现切换到矩阵乘法的标准方法,对于足够小的子矩阵来说,它们更有效。Strassen算法更高效的特定交叉点取决于具体的实现和硬件,据估计Strassen的算法对于宽度从32到128的矩阵可以更快地进行优化实现。“ – janneb 2010-05-09 12:38:09

+0

好点。谢谢! – aioobe 2010-05-09 12:39:45