【问题标题】:Using ThreadPool for parallelisation of Matrix Multiplication使用 ThreadPool 进行矩阵乘法的并行化
【发布时间】:2015-03-24 17:53:08
【问题描述】:

我正在尝试并行矩阵乘法。

我通过在单独的线程中计算矩阵 C 的每个单元格来实现并行化。 (我希望我做对了)。

我的问题是使用线程池是否是创建线程的最佳方式。 (对不起,我对此不熟悉,有人建议这样做)

与此相比,我还会发现使用顺序版本的程序进行计算所需的时间有很大差异吗?

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ParallelMatrix {

public final static int N = 2000; //Random size of matrix
public static void main(String[] args) throws InterruptedException {

    long startTime = System.currentTimeMillis();

    //Create and multiply matrix of random size N.   
    double [][] a = new double [N][N];
    double [][] b = new double [N][N];
    double [][] c = new double [N][N];

    int i,j,k;

    for(i = 0; i < N ; i++) {
        for(j = 0; j < N ; j++){
            a[i][j] = i + j;
            b[i][j] = i * j;
        }

        ExecutorService pool = Executors.newFixedThreadPool(1);
        for(i = 0; i < N; i++) {
            for(j = 0; j < N; j++) {  
                pool.submit(new Multi(N,i,j,a,b,c));
            }
        }
        pool.shutdown();
        pool.awaitTermination(1, TimeUnit.DAYS);
        long endTime = System.currentTimeMillis();
        System.out.println("Calculation completed in " +
             (endTime - startTime) + " milliseconds");

    }
    static class Multi implements Runnable {
        final int N;
        final double [][] a;
        final double [][] b;
        final double [][] c;
        final int i;
        final int j;

        public Multi(int N, int i, int j, double[][] a, double[][] b, double[][] c){
            this.N=N;
            this.i=i;
            this.j=j;
            this.a=a;
            this.b=b;
            this.c=c;
        }

        @Override
        public void run() {
            for(int k = 0; k < N; k++) 
                c[i][j] += a[i][k] * b[k][j];
        }
    }
}

【问题讨论】:

  • 十多年来,我一直在用 java 编写多线程代码,但我从未使用过 java.util.concurrent.Executors 中的任何类。这意味着什么,但我不知道它是什么。
  • 是的,我知道,但这是有人建议在这里编写代码的方式。如果您有其他方法可以做同样的事情,请分享。

标签: java multithreading matrix threadpool


【解决方案1】:

您必须在调度开销、操作持续时间和可用内核数量之间取得平衡。首先,根据可用的内核数量 newFixedThreadPool(Runtime.getRuntime().availableProcessors()) 调整线程池的大小。

为了最大限度地减少调度开销,您希望将操作分成与处理器数量一样多的独立任务(理想情况下执行时间相同)。

通常,您在切片中执行的操作越小,您的调度开销就越多。您现在拥有的(N 个方形任务)有过多的开销(您将创建并提交 2000 次 2000 多个可运行项,每个都只做很少的工作)。

【讨论】:

  • 好的,我明白了!谢谢!所以我已经实现了并行化:)
猜你喜欢
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2017-09-14
  • 2021-07-20
  • 2021-03-08
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多