【问题标题】:Parallel Matrix Calculations平行矩阵计算
【发布时间】:2015-09-24 23:33:05
【问题描述】:

所以我试图以这样一种方式并行化我的矩阵,即矩阵行除以提供的线程数,然后它们计算分配给它们的行。更重要的是,每次迭代都会减小矩阵的大小。

所以在主矩阵中,我将计算一个子矩阵并在线程之间划分该矩阵。

为了使这更容易可视化,我将提供一些伪代码。

for (i = 0; i < matrixSize; i++)
{
     begin = (((matrixSize - i)/numOfThreads) * threadNum + i);
     end = (((matrixSize - i)/numOfThreads) * (threadNum + 1) + i - 1);

        for(j = begin ; j < end; j++) {
            // get which row to calculate within the main matrix
            for (k = i + 1; k < nsize; k++) {
                // calculations for the columns
            }
         }    
}

问题在于设置开始和结束的值。因为矩阵的大小可能是素数,比如 991,所以第一个“块”计算将不得不多做一行。

【问题讨论】:

  • 计算是什么?可能不值得做这个平行!考虑过使用 GPU 吗?
  • 我正在做高斯消元并行,这是为了测试以查看性能增强 - 为学校!
  • 考虑工作线程。过于平行不会有很好的好处。尝试将其限制为 CPU 的数量。
  • 是的,我们正在开发一个 24 CPU 的系统,我打算看看线程的增加和 CPU 的增加将如何影响性能以及是否值得。
  • @EdHeal 如果您甚至不确定计算是否值得并行运行,那么 GPU 有什么意义?

标签: c multithreading matrix parallel-processing


【解决方案1】:

问题在于设置开始和结束的值。因为矩阵的大小可能是素数,比如 991,所以第一个“块”计算必须多做一行。

您可以将每个线程的行数计算为

rowSize = (matrixSize - i)/numOfThreads

这可能会给您留下一些剩余的行。您可以确定剩余的数量为

extraRows = (matrixSize - i) % numOfThreads

您可以将额外的行分配给其中一个线程,或者在您的一些线程之间平均分配它们。

【讨论】:

  • 你知道我如何将这些额外的线程动态分配给剩余的行吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2013-05-06
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多