n无法被p整除时n×n矩阵划分为p行的MPI实现咨询
MPI矩阵行划分的实现思路与代码解析
你选的这种行划分策略非常实用,尤其是在MPI分布式计算里处理矩阵任务时——当n无法被p整除时,让前p-1个进程各承担n/p行,最后一个进程额外承担剩余的n%p行,既能保证逻辑简单,也能让负载尽可能均衡(毕竟只有最后一个进程多处理几行,不会有太大的负载差)。
下面是你提供的代码片段,我帮你用代码块规整并补充了关键的行划分逻辑:
using namespace std; int main(int argc, char* argv[]) { int my_rank = 0; int comm_size = 0; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &comm_size); double *Adata; double **adjArray; int n = ...; // 这里需要定义矩阵的维度n // 计算基础行数和剩余行数 int base_rows = n / comm_size; int remainder = n % comm_size; int my_rows; int start_row; // 按照你的策略分配当前进程负责的行数与起始行索引 if (my_rank == comm_size - 1) { my_rows = base_rows + remainder; start_row = (comm_size - 1) * base_rows; } else { my_rows = base_rows; start_row = my_rank * base_rows; } // 后续可以根据my_rows动态分配当前进程需要的内存 // 例如:adjArray = new double*[my_rows]; // 再逐行分配列空间完成矩阵初始化 MPI_Finalize(); return 0; }
额外提个小建议:如果对负载均衡要求更高,还可以用另一种更均匀的分配方式——让前remainder个进程各多处理1行,剩下的进程处理base_rows行,这样负载分布会更平均。对应的逻辑可以改成:
my_rows = (my_rank < remainder) ? base_rows + 1 : base_rows; start_row = my_rank * base_rows + min(my_rank, remainder);
这种方式适合矩阵维度和进程数差距较大的场景。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

