这可能是一个非常愚蠢的问题,但我看不出我在这段代码中的错误…输出错误,第1位打印:
300万- 300万- 300万- 300万- 300万-
300万- 300万- 300万- 300万- 300万-
300万- 300万- 300万- 300万- 300万-
300万- 300万- 300万- 300万- 300万-
我需要使用MPI_Recv代替Bcast…但到底发生了什么?=/这是我的malloc?或者我不能使用MPI_Recv发送整个矩阵?为什么整个数组不转到另一个进程?
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv){
int rank, size;
int lines, cols;
int i, j;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Status status;
lines = 5;
cols = 5;
if(rank == 0){
double** array = (double**) malloc(lines*sizeof(double*));
for(i=0; i<lines; i++)
array[i] = (double*) malloc(cols*sizeof(double));
for(i=0; i<lines; i++)
for(j=0; j<cols; j++)
array[i][j] = 3;
for(i=0; i<lines; i++){
for(j=0; j<cols; j++)
printf("%f - ", array[i][j]);
printf("n");
}
MPI_Send(&array[0][0], lines*cols, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD);
}
else{
double** arrayNew = (double**)malloc(lines*sizeof(double*));
for (i=0; i<lines; i++)
arrayNew[i] = (double*) malloc(cols*sizeof(double));
MPI_Recv(&arrayNew[0][0], lines*cols, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
for(i=0; i<lines; i++){
for(j=0; j<cols; j++)
printf("%f - ", arrayNew[i][j]);
printf("n");
}
}
MPI_Finalize();
}
这个问题经常出现,问题是C和多维数组。
问题是这一行
MPI_Send(&array[0][0], lines*cols, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD);
告诉MPI从位置&(array[0][0])
开始发送lines*cols
的双精度,同样这行
MPI_Recv(&arrayNew[0][0], lines*cols, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
告诉MPI从位置&(array[0][0])
开始接收lines*cols
双入内存。但是这个分配:
double** arrayNew = (double**)malloc(lines*sizeof(double*));
for (i=0; i<lines; i++)
arrayNew[i] = (double*) malloc(cols*sizeof(double));
不创建连续的双精度lines*cols
数组;它使cols
的lines
数组为双精度,并且这些行可能分散在内存中。您需要执行如下操作:
double** array = (double**) malloc(lines*sizeof(double*));
array[0] = (double *)malloc(lines*cols*sizeof(double));
for(i=1; i<lines; i++)
array[i] = &(array[0][i*cols]);
/* ... */
free(array[0]);
free(array);
分配和释放一个连续的lines*cols
内存块,您可以从中发送和接收。