2

我正在编写一个使用 Executorservice 框架处理矩阵并行编程的程序。而且我将fixedpoolsize设置为4,但令我惊讶的是,当矩阵维度设置为5000时,使用多线程对串行执行的加速大于4(这也是我的CPU内核)。而且我已经检查过我的 CPU 不支持超线程。

实际上,我使用 Callable 和 Future 容器,因为我的多线程任务需要返回结果。


// Part of code for parallel programming   

   double[][] x = new double[N][N];
    List<Future<double[]>> futureList = new ArrayList<>(); 
    for (int k=0;k<N;k++)
    {
        Future<double[]>temp=service.submit(new Thread.Task(N,k,matrix,vector));
        futureList.add(temp);  
    }
    for (int j = 0; j < N; j++) {
           x[j]=futureList.get(j).get(); 
    }

     public double[] call() throws Exception {
        for (int i = N - 1; i >= 0; i--)  
        {
            double sum = 0;
            for (int j = i + 1; j < N; j++)  
            {
                sum += matrix[i][j] * x[j];   
            }
            x[i] = (vector[i][k] - sum) / matrix[i][i]; 
        }
        return x;
    }

 // Part of code for Serial programming

    double[][] x = new double[N][N]; 
    for (int k=0;k<N;k++)
    {
        for (int i = N - 1; i >= 0; i--)  
        {
            double sum = 0;
            for (int j = i + 1; j < N; j++)  
            {
                sum += matrix[i][j] * x[j][k];   
            }
            x[i][k] = (vector[i][k] - sum) / matrix[i][i]; 
        }

    }

简而言之,我只是将内部循环拿走,让它由线程运行,而外部循环保持不变。

但是加速怎么可能是这样的呢?

因为从我之前的概念来看,最大加速只能是 4。我已经检查过该任务实际上是由 4 个线程完成的。

4

2 回答 2

0

这可能是 CPU 缓存亲和性的影响。如果每个核心处理问题的不同部分,它可能会在缓存使用方面实现更高的效率。因为 RAM 比缓存慢 10 倍或更多倍,所以这会产生巨大的差异。

于 2019-10-30T17:25:48.810 回答
0

线程可以在同一个 cpu 上使用。您不需要多核处理器来执行多线程应用程序。

将线程想象成一个小进程,它由父程序创建并在完成后销毁。即使是单个 cpu 计算机也可以同时运行多个线程。

ExecutorService调度要执行的线程,并将运行尽可能多的并行线程,因为包括内核在内的可用资源。

这是关于fixedThreadPool

公共静态 ExecutorService newFixedThreadPool(int nThreads)

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。池中的线程将一直存在,直到它被显式关闭

你也可以试试workStealingPool

公共静态 ExecutorService newWorkStealingPool()

创建一个工作窃取线程池,使用所有可用处理器作为其目标并行度级别。

于 2019-10-30T16:34:51.933 回答