Multithreading 如何在矩阵乘法的辅助进程中处理n而不是p的倍数?
我正在研究一个关于使用辅助进程进行矩阵乘法的伪代码的问题。w是工人数量,p是处理器数量,n是进程数量。 psuedocode通过将i行划分为每个n/P行的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 =
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