多线程java并行化矩阵乘法

zphenhs4  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(401)

嘿,我想把两个矩阵a,b的乘法并行化。
不幸的是,串行实现仍然比并行实现快,或者加速比太低(矩阵维数为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;
    }
s2j5cfk0

s2j5cfk01#

根本没有什么不对劲。
与几次乘法相比,创建线程意味着巨大的开销。目前,对于512*512矩阵,您将创建512个线程。您的cpu肯定少于512个内核,因此只有8个或16个内核可以在不同的内核上并行运行,但是大约500个其他内核也消耗了创建开销,而不会增加并行执行。
尝试将线程数限制在接近cpu核心数的范围内,可以使用自己的逻辑,也可以使用框架,例如java.util.concurrent包。

相关问题