我搜索了很多解释,但我想我无法弄清楚我该怎么做这种情况。我想做这样的事情:使用主处理器,我正在创建一个动态二维数组。然后我想;
1-将此数组发送到其他处理器。并且每个处理器打印这个二维数组 2-将该数组的一部分发送给其他人。每个处理器都将它们的部分打印到屏幕上。
例如; 我有 2D 阵列 11*11 和 4 个处理器。等级 0 是大师。其他人是奴隶。对于第一种情况,我想将所有数组发送到排名 1、排名 2 和排名 3。对于第二种情况,我想将行共享给从站。11/3 = 3。因此排名 1 需要 3 行,排名 2 需要 3 行,排名 3 需要 5 行。
这是我的代码:
int processorID;
int numberOfProcessors;
int main(int argc, char* argv[]){
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD ,&numberOfProcessors);
MPI_Comm_rank(MPI_COMM_WORLD ,&processorID);
double **array;
if(MASTER){
array = (double**) malloc(11*sizeof(double *));
for(i=0; i<11; i++){
array[i] = (double *) malloc(11*sizeof(double));
}
for(i=0; i<11; i++){
for(j=0; j<11; j++){
array[i][j] = i*j;
}
}
}
MPI_Bcast(array, 11*11, MPI_DOUBLE, 0, MPI_COMM_WORLD);
if(SLAVE){
for(i=0; i<11; i++){
for(j=0; j<11; j++){
printf("%f ", array[i][j]);
}
}
}
MPI_Finalize();
return 0;
}
根据这些链接;MPI_Bcast 一个动态二维数组;我需要将我的数组创建为;
if (MASTER){
array = (double**) malloc(121*sizeof(double))
for(i=0; i<11; i++){
for(j=0; j<11; j++){
array[i][j] = i*j; // this is not working.
}
}
}
但如果我这样做,我无法初始化数组中的每个成员。内部 for 循环不起作用。我找不到任何方法来解决它。
对于我的第二个问题,我按照此链接使用 MPI 在 C 中发送二维数组块。我想我需要改变 if(SLAVE) 的内部。我应该为每个从处理器创建 2D subArrays。我需要使用 MPI_Scatterv。但我无法完全理解。
int main() {
...
...
MPI_Scatterv() // what must be here?
if(SLAVE){
if(processorID = numberOfProcessor-1){
subArray = (double**) malloc(5*sizeof(double *)); // beacuse number of row for last processor is 5
for(i=0; i<11; i++){
array[i] = (double *) malloc(11*sizeof(double));
}
}
else {
subArray = (double**) malloc(3*sizeof(double *));
for(i=0; i<11; i++){
array[i] = (double *) malloc(11*sizeof(double));
}
}
}
}