Multithreading 如何在矩阵乘法的辅助进程中处理n而不是p的倍数?

Multithreading 如何在矩阵乘法的辅助进程中处理n而不是p的倍数?,multithreading,matrix,concurrency,parallel-processing,pseudocode,Multithreading,Matrix,Concurrency,Parallel Processing,Pseudocode,我正在研究一个关于使用辅助进程进行矩阵乘法的伪代码的问题。w是工人数量,p是处理器数量,n是进程数量。 psuedocode通过将i行划分为每个n/P行的P条来计算矩阵结果 process worker[w = 1 to P] int first = (w-1) * n/P; int last = first + n/P - 1; for [i = first to last] { for [j = 0 to n-1] { c[i,j] = 0.0; for[k =

我正在研究一个关于使用辅助进程进行矩阵乘法的伪代码的问题。w是工人数量,p是处理器数量,n是进程数量。 psuedocode通过将i行划分为每个n/P行的P条来计算矩阵结果

process worker[w = 1 to P]
 int first = (w-1) * n/P;
 int last = first + n/P - 1;
 for [i = first to last] {

  for [j = 0 to n-1] {

    c[i,j] = 0.0;
    for[k = 0 to n-1]
     c[i,j] = c[i,j] + a[i,k]*b[k,j];
    }
   }
 }

我的问题是,如果n不是p处理器的倍数,我将如何处理?通常情况下,n不可被p整除?

最简单的解决方案是给最后一个工作者所有剩余的行,它们不会超过p-1:

n mod p是n除以p的余数

或更改“第一个”和“最后一个”的计算方式,如下所示:

int first = ((w-1) * n)/P
int last = (w * n)/P - 1
当n不能被p整除时,这会自动处理。在大多数语言中,*和/具有相同优先级且左关联的情况下,括号并不是必需的。关键是,n的乘法应该发生在P的除法之前

示例:n=11,p=3:

w=1:first=0,last=23行 w=2:first=3,last=6 4行 w=3:first=7,last=10 4行 这是一个更好的解决方案,因为它将剩余的分工平均分配给工人

int first = ((w-1) * n)/P
int last = (w * n)/P - 1