如何使用MPI阻塞功能等待所有进程接收特定数据?

时间:2015-08-28 07:50:35

标签: mpi openmpi

我正在使用MPI_SendMPI_Recv函数逐行将邻接矩阵分发到进程。我使用MPI_Barrier,但程序卡住了!我如何等待所有过程都成为矩阵的一部分?

/* Distribute the adjacency matrix */
if( my_rank == 0) {
    int row_start_l, row_end_l, dest_l;

    for(dest_l=1; dest_l < comm_size; dest_l++) {

        row_start_l = dest_l*(num_nodes/comm_size);
        if( dest_l != (comm_size - 1) ) {
            row_end_l = (dest_l + 1)*(num_nodes/comm_size) - 1;
        }
        else {
            row_end_l = num_nodes - 1;
        }

        for(i = row_start_l; i <= row_end_l; i++) {
            MPI_Send(&g.matrix[i][1], 1, MPI_INT, dest_l, TAG_AM_DATA, MPI_COMM_WORLD);
            // Send Adjacency matrix to appropriate destinations. You can first send the appropriate size
            MPI_Send(&g.matrix[i], (g.matrix[i][1])+2, MPI_INT, dest_l, TAG_AM_DATA, MPI_COMM_WORLD);
        }
    }
    for(j=0; j < num_nodes; ) {
        for(k=0; k < 120; k++) {
            if(j >= num_nodes) {
                break;
            }
            sendrecv_buffer_double[k] = g.column_denominator[j];
            j++;
        }
        MPI_Bcast(&k, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        MPI_Bcast(&sendrecv_buffer_double[0], k, MPI_DOUBLE, 0, MPI_COMM_WORLD);
    } cnt++;
}
else {

    int recv_count;
    int recvd;
    cnt++;
    adj_matrix = (int **)malloc(my_num_rows*sizeof(int*));
    for(i=0; i < my_num_rows; i++) {

        MPI_Recv(&recv_count, 1, MPI_INT, 0, TAG_AM_DATA, MPI_COMM_WORLD, &status);

        adj_matrix[i] = (int *)malloc((2 + recv_count)*sizeof(int));

        // Receive adjacency matrix from root.
        MPI_Recv(&adj_matrix[i], 2+recv_count, MPI_INT, 0, TAG_AM_DATA, MPI_COMM_WORLD, &status);
    }

    recvd = 0;
    while(recvd < num_nodes) {
        MPI_Bcast(&recv_count, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        MPI_Bcast(&g.column_denominator[recvd], recv_count, MPI_DOUBLE, 0, MPI_COMM_WORLD);
        recvd += recv_count;
    }
}

// Wait till all the processes have their assigned parts of the matrix.
MPI_Barrier(MPI_COMM_WORLD);//I am getting error here

错误讯息:

  

处理0读取输入文件。节点数= 100处理0
  完成阅读.. PMPI_Barrier中的致命错误:消息被截断,错误
  stack:PMPI_Barrier(426)...................:
  MPI_Barrier(MPI_COMM_WORLD)失败   MPIR_Barrier_impl(308)..............:
  MPIR_Bcast_impl(1369)...............:
  MPIR_Bcast_intra(1199)..............:
  MPIR_Bcast_binomial(149)............:
  MPIC_Recv(109)......................:
  MPIDI_CH3U_Request_unpack_uebuf(605):消息被截断; 8个字节
  收到但缓冲区大小为1

1 个答案:

答案 0 :(得分:0)

我不太确定你的“邻接矩阵”是什么样的以及必须如何分发,但我想这是private void TextBoxPreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Subtract) { e.Handled = true; var text = "-"; var target = Keyboard.FocusedElement; var routedEvent = TextCompositionManager.TextInputEvent; target.RaiseEvent( new TextCompositionEventArgs ( InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, target, text) ) { RoutedEvent = routedEvent }); } } 的工作,而不是一系列的MPI_Scatter() ...