C++ MPI点对点通信到集体通信
我正在学习MPI,我正在尝试将我的MPI计划从点对点通信转换为MPI集体 下面是我使用MPI点对点通信进行矩阵乘法的代码片段C++ MPI点对点通信到集体通信,c++,mpi,C++,Mpi,我正在学习MPI,我正在尝试将我的MPI计划从点对点通信转换为MPI集体 下面是我使用MPI点对点通信进行矩阵乘法的代码片段 int i; if(rank == 0) { for(i = 1; i < size; i++){ MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD); MPI_Send(&columns, 1, MPI_INT, i, 0, MP
int i;
if(rank == 0) {
for(i = 1; i < size; i++){
MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
MPI_Send(&columns, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
} else {
MPI_Recv(&rows, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(&columns, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
}
int local_block_size = rows / size;
int process, column_pivot;
if(rank == 0) {
for(i = 1; i < size; i++){
MPI_Send((matrix_1D_mapped + (i * (local_block_size * rows))), (local_block_size * rows), MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
MPI_Send((rhs + (i * local_block_size)), local_block_size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
}
for(i = 0; i < local_block_size * rows; i++){
matrix_local_block[i] = matrix_1D_mapped[i];
}
for(i = 0; i < local_block_size; i++){
rhs_local_block[i] = rhs[i];
}
} else {
MPI_Recv(matrix_local_block, local_block_size * rows, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
MPI_Recv(rhs_local_block, local_block_size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
}
inti;
如果(秩==0){
对于(i=1;i
我正在考虑用MPI\U Bcast替换MPI\U发送。。。这是正确的方法吗 对于第一次通信,发送到所有接收器的数据实际上是相同的,因此
MPI\u Bcast
是正确的方法。第二次通信将较大数组中的不同块分发给接收者,这是通过MPI\u Scatter
作为一个集合来完成的。请注意,分散包括通信中的根列组,因此您可以省略手动本地副本。对于recv部分,我应该使用哪些集合操作??)@Zulan您需要用一个集合操作来替换发送和接收。此外,为了获得最佳的广播性能,您可以将行
和列
复制到阵列中或从阵列中复制,并通过单个调用广播它们。