使用OpenMPI进行并行编程:程序未运行

时间:2017-01-16 17:56:19

标签: parallel-processing openmpi

所以我对并行编程的范式很陌生。我试图通过索引矩阵从我的根进程(rank = 0)发送到从属进程(rank = 1)。所以我使用以下命令来运行它:

  • mpicc q_9.c -o q_9
  • mpirun -np 2 ./q_9

程序编译成功,但无法运行。我感觉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退出不当。这可能有三个原因:

  1. 这个过程在退出之前没有调用“init”,而是在其他人中调用 这份工作做到了。这可能导致作业在等待时无限期挂起 对于所有进程调用“init”。按规则,如果一个进程调用“init”, 然后所有进程必须在终止前调用“init”。

  2. 此过程称为“init”,但退出时不调用“finalize”。 按规则,所有调用“init”的进程必须在之前调用“finalize” 退出或将被视为“异常终止”

  3. 此过程称为“MPI_Abort”或“orte_abort”和mca参数 orte_create_session_dirs设置为false。在这种情况下,运行时不能 检测到中止呼叫是异常终止。因此,唯一的 您将收到的错误消息是此消息。

  4. 这可能导致应用程序中的其他进程 由mpirun发送的信号终止(如此处所述)。

0 个答案:

没有答案