0

MPI_Scatter を使用して次のマトリックスを送信する方法を教えてください。

float **u, **u_local;

if (rank == 0){
    u = (float**) malloc(N * size * sizeof(float*));
    for(i = 0; i < N * size; i++){
        u[i] = (float*) malloc(M * sizeof(float));
        memset(u[i], 0, M * sizeof(float));
    }
}

u[N][M] 行列をすべてのプロセスに均等に送信したい (u_local) N 行数 M 列数

ありがとう

4

1 に答える 1

0

最も簡単な解決策は、メモリを線形に割り当てることです。

float **u, *u_stor;

if (rank == 0) {
    // Watch out for possible integer overflow while computing memory size
    u_stor = malloc(N * size * M * sizeof(float));
    for (i = 0; i < N * size; i++) {
        u[i] = &u_stor[i * M];
    }
    memset(u_stor, 0, N * size * M * sizeof(float));
}

の各行をu個別に割り当てる代わりに、このコードは行列全体と同じ大きさのメモリのチャンクを割り当ててから、 の- 番目の行u[i]の開始点へのポインターに割り当てます。行はメモリに連続的に配置され、単純なスキャッターを使用できます。iu_stor

float **u_local, *u_local_stor;
u_local_stor = malloc(N * M * sizeof(float));
for (i = 0; i < N; i++)
    u_local[i] = &u_local_stor[i * M];

MPI_Scatter(u[0], N * M, MPI_FLOAT,
            u_local[0], N * M, MPI_FLOAT,
            0, MPI_COMM_WORLD);
于 2012-10-08T08:55:58.260 に答える