1

我正在做一个简单的 MPI 分配,它可以进行行矩阵乘法。

我正在尝试输出矩阵,由于某种原因,打印的顺序是乱序的。一次只指定一个进程打印,如果刷新则输出,并使用 MPI_Barrier。所以我很困惑印刷品是如何重新排序的。

void print_matrix(int id, int p, int pn, int n, double **row, double *shared_col_data, double *resdata){
    int i,j, k;
    for(i=0; i<p; i++){
        for(k=0; k < pn; k++){

            int row_pos=((i*pn)+k);

            if(id==i){
                if( row_pos <n){
                    printf("[ROW: %10d][ID: %3d]\t",row_pos,id);
                    printf("|");

                    for(j=0; j<n; j++){
                        printf("%.4f ",row[k][j]);
                    }

                    if(row_pos == (n/2)){
                        printf("| X |");
                    }
                    else{
                        printf("|   |");
                    }

                    printf("%.4f ",shared_col_data[row_pos]);
                    fflush(stdout);
                }
            }//End its ur turn to print

            MPI_Barrier (MPI_COMM_WORLD);
            if(id==0){
                if(row_pos == (n/2)){
                    printf("| = |");
                }
                else{
                    printf("|   |");
                }
                printf("%.4f|\n",resdata[row_pos]);
                fflush(stdout);

            }

            MPI_Barrier (MPI_COMM_WORLD);
        }


    }//End Processor Loop


}

这是一个示例输出:

Input Size(N): 12
Processors(P): 12
N per Processors(P): 1
ID:  3 SN: 3 EN: 3
ID:  0 SN: 0 EN: 0
ID:  2 SN: 2 EN: 2
ID:  4 SN: 4 EN: 4
ID:  11 SN: 11 EN: 11
ID:  7 SN: 7 EN: 7
ID:  8 SN: 8 EN: 8
ID:  6 SN: 6 EN: 6
ID:  10 SN: 10 EN: 10
ID:  1 SN: 1 EN: 1
ID:  9 SN: 9 EN: 9
ID:  5 SN: 5 EN: 5
All Data Generated
Column Data Shared
Multiplication Done
All res Gather
[ROW:          0][ID:   0]  |0.5974 0.7066 0.9131 0.1548 0.4382 0.5132 0.3729 0.5554 0.7832 0.7953 0.5202 0.6986 |   |0.8076 |   |2.4959|
[ROW:          1][ID:   1]  |0.4320 0.9492 0.2266 0.1211 0.3904 0.9614 0.2000 0.7380 0.4471 0.3622 0.9844 0.1921 |   |0.0051 |   |2.3152|
[ROW:          2][ID:   2]  |0.2821 0.6740 0.9673 0.6623 0.6922 0.9760 0.8697 0.0096 0.6827 0.9590 0.2399 0.1100 |   |0.2254 |   |2.8286|
[ROW:          3][ID:   3]  |0.5915 0.1042 0.7262 0.8395 0.9665 0.9716 0.2252 0.7184 0.6054 0.8336 0.5033 0.2620 |   |0.3670 |   |2.8024|
|   |2.1632|
[ROW:          4][ID:   4]  |0.0821 0.3956 0.0252 0.9953 0.3822 0.4278 0.8978 0.7726 0.5235 0.2972 0.3229 0.4520 |   |0.1409 
[ROW:          5][ID:   5]  |0.5684 0.0840 0.5961 0.7087 0.1331 0.1426 0.1554 0.3976 0.2051 0.1481 0.9468 0.7025 |   |0.5302 |   |2.1380|
| = |2.7801|
[ROW:          6][ID:   6]  |0.7347 0.9194 0.3374 0.9823 0.1040 0.3878 0.7086 0.3132 0.4359 0.8223 0.2545 0.8752 | X |0.9129 
[ROW:          7][ID:   7]  |0.0464 0.6857 0.7146 0.6858 0.3210 0.2477 0.5767 0.2342 0.1406 0.5467 0.4063 0.0733 |   |0.1262 |   |1.8125|
[ROW:          8][ID:   8]  |0.6413 0.1076 0.2843 0.3515 0.9252 0.0349 0.0830 0.5063 0.9232 0.9900 0.5849 0.5612 |   |0.0204 |   |2.1263|
[ROW:          9][ID:   9]  |0.5292 0.3410 0.8543 0.5942 0.5822 0.3245 0.1719 0.9346 0.7611 0.3722 0.9653 0.4368 |   |0.5167 |   |2.4469|
|   |2.6545|
[ROW:         10][ID:  10]  |0.7641 0.6008 0.9687 0.9276 0.2462 0.2832 0.0131 0.0390 0.4860 0.6569 0.9390 0.7620 |   |0.7972 |   |2.0755|
[ROW:         11][ID:  11]  |0.7291 0.5953 0.6171 0.0396 0.5790 0.5262 0.5881 0.2631 0.9517 0.5118 0.0835 0.2115 |   |0.2310 

您可以看到一些行以其他行的结尾开始,但打印这些行的代码被屏障包围。

我觉得这是一个简单的问题,我很累看到它

谢谢你的帮助。

4

1 回答 1

0

MPI 规范不包括并行 I/O。这纯粹取决于实现。

于 2013-05-20T08:54:06.537 回答