搜索最快的方法来计算大矩阵并输出它们?

时间:2014-04-10 21:24:27

标签: java c matrix fortran computer-science

我正在尝试编写有关传感器计算器的程序,我想听听你们,我们如何才能改善程序的执行时间?

简而言之,传感器计算器是执行矩阵乘法的程序。它每秒可以接收50,000个矩阵。传感器计算器的主要工作是接收矩阵并使用已存储在程序中的5个矩阵之一来计算它们。

传感器计算器有5种方法,每种方法都有自己的矩阵,它与接收(参数)矩阵(矩阵乘法)相乘。当然,他们返回生产的矩阵。

  1. 我在各种计算机上共有5万个虚拟审查。
  2. 每个传感器都使用UDP将每秒一个矩阵发送到计算器(服务器)。
  3. 托管传感器计算器的服务器,接收矩阵并计算它。
  4. 服务器将使用UDP将结果发送回传感器(客户端)。
  5. 所有矩阵的大小均为10x10。

    例如,第一种方法是:

    public int[10][10] calculateWind(int[10][10] A){
    
     int[10][10] C = new int[10][10]; //
    
        for (int i = 0; i < 10; i++) { // Row
            for (int j = 0; j < 10; j++) { // Column
                for (int k = 0; k < 10; k++) { // Column
                    C[i][j] += A[i][k] * B[k][j];//B is constant matrix(private attribute)
                }
            }
        }
    
        return C;}
    

    我正在使用Java,但有人告诉我,我可以使用FORTRAN&amp; C与Java,这可能会有所帮助?

    我正在努力找到最快捷的方式。告诉我们你认为可以帮助我的程序改善它的性能的一切。改变编程语言?使用独特的算法?

    除了使用ASSEMBLY之外,欢迎提出任何建议,并感谢您的建议。

2 个答案:

答案 0 :(得分:0)

有些库使用比直接的三个嵌套循环更快的算法实现矩阵乘法。

考虑这个答案:Performance of Java matrix math libraries?

答案 1 :(得分:0)

您应该在分析器中运行该程序以查找热点,并测量您的更改所产生的效果。

可能的改进是重新排序循环以最小化缓存未命中:

for (int i = 0; i < 10; i++) {
    for (int k = 0; k < 10; k++) {
        for (int j = 0; j < 10; j++) {
            C[i][j] += A[i][k] * B[k][j];
        }
    }
}

对于像你这样小的矩阵,不太可能有显着的改进,因为你的整个数据都适合CPU缓存。

使用C不太可能提高性能。经过几次迭代后,JIT会将代码编译为native,而CPU运行的代码基本上与C编译器生成的代码相同。由于自动矢量化,Fortran可能会更好,但对于这么小的矩阵来说差异可能并不大。