我想從MPI配置中的節點收集一些不同的矩陣行。到目前爲止,我已經有了一個程序來接收另一個進程的代碼,下面是代碼,即代碼將recv
更改爲數字1..7
,但理想情況下,我想要的是更改前兩行,第一行的編號爲1..7
,第二行的編號爲8..14
,但當我更改第55/57行的發送/接收計數時,不會發生這種情況。這些塊應該在內存中連續佈置,所以我不確定我目前出錯的地方,任何幫助將不勝感激。MPI gatherv多個向量
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <math.h>
#include <string.h>
#include <unistd.h>
double **allocMatrix(int dim) {
int i;
double **matrix;
matrix = (double **)malloc(dim*sizeof(double *));
for(i=0; i < dim; i++) {
matrix[i] = (double *)malloc(dim*sizeof(double));
}
return matrix;
}
void printMatrix(double **values, int size) {
int i, j;
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
printf("%10lf ", values[i][j]);
}
printf("\n");
}
}
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
int size, rank, i, j;
int dimensions = 7;
MPI_Comm_size(MPI_COMM_WORLD, &size);//number of processes
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//rank for each process
double **send = allocMatrix(dimensions);
double **recv = allocMatrix(dimensions);
int count = 0;
for (i=0; i<dimensions; i++) {
for (j=0; j<dimensions; j++) {
if (rank == 0) {
recv[i][j] = 0;
} else {
send[i][j] = ++count;
}
}
}
MPI_Datatype arrType;
MPI_Type_vector(1, dimensions, 0, MPI_DOUBLE, &arrType);
MPI_Type_commit(&arrType);
int recvCounts[size];
int displs[size];
recvCounts[0] = 0;
displs[0] = 0;
recvCounts[1] = 1;
displs[1] = 0;
MPI_Gatherv(&(send[0][0]), 1, arrType,
&(recv[0][0]), recvCounts, displs, arrType,
0, MPI_COMM_WORLD);
if (rank == 0) {
printMatrix(recv, dimensions);
}
MPI_Finalize();
return 0;
}
輸出:
make gatherv
mpicc -Wall -o gatherv gatherv.c && ./gather
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
希望的輸出:
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000
8.000000 9.000000 10.00000 11.00000 12.00000 13.00000 14.00000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
運行的代碼我想你可能有一個邏輯錯誤在你的'MPI_Gatherv',所有的進程發送陣列的相同部分,它在非零排序過程中以完全相同的方式初始化。 – struct 2014-12-19 11:15:35
@RichardTownsend對不起,忘了添加我只在這兩個進程上運行這個 - 我知道如何進一步擴展它,但我想知道如何在繼續之前先發送多行。 – micr0sub 2014-12-19 11:23:05