java - 并行矩阵乘法

原文 标签 java multithreading matrix matrix-multiplication java-threads

我正在尝试并行化两个矩阵AB的乘法。
不幸的是,串行实现仍然比并行实现快,或者加速太慢。 (矩阵尺寸= 512时,加速类似于1.3)。可能根本上是错的。外面有人可以给我小费吗?

double[][] matParallel2(final double[][] matrixA,
                        final double[][] matrixB,
                        final boolean parallel) {
    int rows = matrixA.length;
    int columnsA = matrixA[0].length;
    int columnsB = matrixB[0].length;

    Runnable task;
    List<Thread> pool = new ArrayList<>();

    double[][] returnMatrix = new double[rows][columnsB];
    for (int i = 0; i < rows; i++) {
        int finalI = i;
        task = () -> {
            for (int j = 0; j < columnsB; j++) {
                //  returnMatrix[finalI][j] = 0;
                for (int k = 0; k < columnsA; k++) {
                    returnMatrix[finalI][j] +=
                            matrixA[finalI][k] * matrixB[k][j];
                }
            }
        };
        pool.add(new Thread(task));
    }
    if (parallel) {
        for (Thread trd : pool) {
            trd.start();
        }
    } else {
        for (Thread trd : pool) {
            trd.run();
        }
    }
    try {
        for (Thread trd : pool) {
            trd.join();
        }
    } catch (
            Exception e) {
        e.printStackTrace();
    }
    return returnMatrix;
}

最佳答案

根本上没有错。
与几个乘法相比,创建线程意味着巨大的开销。当前,对于512 * 512矩阵,您创建512个线程。您的CPU肯定少于512个内核,因此仅它们中的8个或16个将真正在不同的内核上并行运行,但是其他约500个内核也消耗了创建开销,而没有增加并行执行的时间。
尝试使用您自己的逻辑或使用框架(例如,使用Linux)将线程数限制在更接近CPU内核数的水平。 java.util.concurrent包。

关于java - 并行矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65007123/

相关文章:

JavaFX - onCloseRequest() 否决了我的 boolean 语句

java - 尝试在Java中将字符串中的每个单词大写

c++ - 在线程中复制文件以防止应用程序卡住

multithreading - 使用windbg时如何设置当前线程

ios - iOS创建UIButtons矩阵

java - 将 "Java School"程序员变成 C 或 C++ 程序员有多难?

java - 使用Java中的多个条件搜索书籍

c# - 在高容量 IIS 网站上运行时 Entity Framework 是否会失败

c++ - 如何使用静态成员函数创建一个矩阵,然后可以使用运算符重载打印该矩阵?

java - 从ejml中的N x M矩阵中减去1 x M矩阵