MPI广播动态二维数组到其他处理器



我找了很多解释,但我想我不知道我怎么能做到这种情况。我想做这样的事情:使用主处理器,我正在创建一个动态二维数组。然后我想;

1-将此数组发送到其他处理器。每个处理器打印这个二维数组2-发送这个数组的一部分给其他人。每个处理器将各自的部件打印到屏幕上。

例如

;我有2D数组11*11和4个处理器。0级为master。其他人则是奴隶。对于第一种情况,我想让所有数组的秩分别为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中发送2D数组块。我想我需要改变它的内部(SLAVE)。我应该为每个从处理器创建2D子数组。我需要使用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));
            }
        }
    }
}

C并没有真正的多维数组。我建议将您的值存储在常规的1D缓冲区中,然后从1D值计算正确的索引。像这样:

double* data = (double*)malloc(sizeof(double)*11*11);
// Now, to access data[i][j], simply do:
data[j + i*11] = ...; // this "maps" 2D indices into 1D

这将为您省去分层malloc -ing的所有麻烦,并且可以轻松地将其传递给MPI api。

您不能使用指针数组(您错误地称为"2D数组"),因为每个行指针不能移植到另一个节点的地址空间。

你引用的在线性内存分配中创建二维数组的代码是完全正确的,你所需要做的就是按行主顺序索引内存,这样循环就变成:

double* array = (double*) malloc(121*sizeof(double)); 
if (MASTER){
    for(i=0; i<11; i++){
        for(j=0; j<11; j++){
            array[j+i*11] = i*j;  // row major indexing here
        }
    }
}
/* Scatter code follows */

您可以安全地将这种数组分散到多个节点。

相关内容

最新更新