首页 > 解决方案 > 并行矩阵乘法

问题描述

我正在尝试并行化两个矩阵的乘法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;
}

标签: javamultithreadingmatrixmatrix-multiplicationjava-threads

解决方案


根本没有什么问题。

与几次乘法相比,创建线程意味着巨大的开销。目前,对于 512*512 矩阵,您创建 512 个线程。您的 CPU 肯定少于 512 个内核,因此只有 8 或 16 个内核会真正在不同的内核上并行运行,但另外约 500 个内核也消耗了创建开销,而不会增加并行执行。

尝试使用您自己的逻辑或使用框架(例如 java.util.concurrent 包)将线程数限制为更接近 CPU 内核数。


推荐阅读