【问题标题】:Searching the fastest way to calculate large matrices and output them?搜索计算大型矩阵并输出它们的最快方法?
【发布时间】:2014-04-10 21:24:26
【问题描述】:

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

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

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

  1. 我在各种计算机上总共有 50 000 个虚拟审查员。
  2. 每个传感器都通过 UDP 每秒向计算器(服务器)发送一个矩阵。
  3. 承载传感器计算器、接收矩阵并计算它的服务器。
  4. 服务器将使用 UDP 将结果发送回传感器(客户端)。

所有矩阵都是 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 & C 与 java 一起使用,这会有所帮助吗?

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

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

【问题讨论】:

  • 您可以通过 Java 本地接口 JNI 将矩阵从 Java 传递到 C 或 Fortran 代码,如下所述:stackoverflow.com/questions/14725789/…
  • 从 java 传递到 Fortran 是否有任何延迟?
  • 有一些延迟,但它大约是矩阵中行数的平方。计算矩阵乘积的时间往往占主导地位,大约是矩阵中行数的立方。这是指导您的经验法则。为了准确地知道您想要测量。
  • 您的帖子中的意思是“传感器”而不是“审查员”吗?你多次使用“审查员”这个词。
  • 是的,我是说传感器,谢谢。

标签: java c matrix fortran computer-science


【解决方案1】:

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

一个可能的改进是重新排序循环以最大程度地减少缓存未命中:

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 会将代码编译为本机代码,并且 CPU 运行的代码与 C 编译器生成的代码基本相同。由于自动矢量化,Fortran 可能会更好,但对于这么小的矩阵,差异可能并不大。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对于小至 10x10 的矩阵,调用外部库的开销可能大于直接计算乘积。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多