所以我试图以这样的方式平行我的矩阵,即矩阵行除以提供的线程数,并计算分配给它们的行。踢球者是每次迭代都会减小矩阵的大小。
因此,在主矩阵中,我将对子矩阵进行计算,并在线程之间划分该矩阵。
为了使这更容易可视化,我将提供一些伪代码。
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,第一个&#34;块&#34;计算将不得不做一个额外的行。
答案 0 :(得分:0)
问题是设置开始和结束的值。因为矩阵的大小可能是素数,比如991,所以计算的第一个“块”将需要额外的行。
您可以将每个线程的行数计算为
rowSize = (matrixSize - i)/numOfThreads
这可能会留下一些遗留的行。您可以确定剩余的数量为
extraRows = (matrixSize - i) % numOfThreads
您可以将额外的行分配给其中一个线程,或者在某些线程之间平均分配它们。