所以我对并行编程的范式很陌生。我试图通过索引矩阵从我的根进程(rank = 0)发送到从属进程(rank = 1)。所以我使用以下命令来运行它:
程序编译成功,但无法运行。我感觉MPI_Send()和MPI_Recv()例程未正确同步。任何形式的帮助都会有很长的路要走。以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int curr_rank;
int num_process;
int i;
int j;
int in_matrix[4][4];
int out_matrix[4][4];
int num_rows = 4;
int num_cols = 4;
int displacement_array[4];
int block_length[4];
MPI_Datatype new_index_t;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_process);
MPI_Comm_rank(MPI_COMM_WORLD, &curr_rank);
if(num_process == 2){
if(curr_rank == 0){ /*Root process populates the matrix*/
/*Initialize matrix*/
for(i = 0 ; i < num_rows ; i++){
for(j = 0 ; j < num_cols ; j++){
in_matrix[i][j] = i + j;
}
}
}
for(i = 0 ; i < num_rows ; i++){
displacement_array[i] = (num_rows * i) + num_rows;
block_length[i] = (num_rows - i);
}
MPI_Type_indexed(num_rows, block_length, displacement_array, MPI_INT, &new_index_t);
MPI_Type_commit(&new_index_t);
if(curr_rank == 0){
MPI_Send(in_matrix, 1, new_index_t, 1, 0, MPI_COMM_WORLD);
}
else{
for(i = 0 ; i < num_rows ; i++){
for(j = 0 ; j < num_cols ; j++){
out_matrix[i][j] = 0;
}
}
MPI_Recv(out_matrix, 1, new_index_t, 0, 0, MPI_COMM_WORLD, &status);
/*Indexed output matrix*/
for(i = 0 ; i < num_rows ; i++){
for(j = 0 ; j < num_cols ; j++){
printf("%d ", out_matrix[i][j]);
}
printf("\n");
}
}
}
MPI_Finalize();
}
编辑:
我在另一个系统上运行它,我收到一条消息: mpirun已退出,因为进程等级为0且PID为10449 节点abhijeet-mohanty-2退出不当。这可能有三个原因:
这个过程在退出之前没有调用“init”,而是在其他人中调用 这份工作做到了。这可能导致作业在等待时无限期挂起 对于所有进程调用“init”。按规则,如果一个进程调用“init”, 然后所有进程必须在终止前调用“init”。
此过程称为“init”,但退出时不调用“finalize”。 按规则,所有调用“init”的进程必须在之前调用“finalize” 退出或将被视为“异常终止”
此过程称为“MPI_Abort”或“orte_abort”和mca参数 orte_create_session_dirs设置为false。在这种情况下,运行时不能 检测到中止呼叫是异常终止。因此,唯一的 您将收到的错误消息是此消息。
这可能导致应用程序中的其他进程 由mpirun发送的信号终止(如此处所述)。