0

我是一个 baginner MPI 用户,我的计算并行代码可能会出错。

我需要计算一个大型数据集的迭代估计,并且我想使用 C 中的 MPI 并行计算它。

我制作了一个标准 (ANSI) C 函数 ('myFunc') 来根据输入参数 ('param_1',param_3,'table_1','table_2','table_3') 估计输出数据集 ('param_2') 中的一个元素) 和上一次迭代的估计 ('param_2')。如果我们将新估计('param_2')分成块,计算可以并行完成。

当我对代码进行一些分析时,我意识到计算几乎同时在每个节点(线程)上开始,但它是以串行方式完成的,一个接一个(它们之间有固定的时间间隔)。看起来他们正在使用一些共享资源或类似的东西......我试图消除线程之间的所有并发,但我担心我没有足够的 MPI 经验来解决这个问题。

我认为所有 MPI 线程都有自己的声明变量的“副本”并相互独立地使用它们,所以我不明白为什么线程在拥有自己的参数副本时会相互等待完成计算。 .

这是代码的简单字段版本:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <mpi.h>

#define X 131
#define Y 131
#define Z 150

#define MASTER 0

float table_1[31][8];
float table_2[31][4];
float table_3[31][2];

int main(int argc, char* argv[]) {

    float *param_1;
    float *param_2;
    float param_3;
    float *chunk;

    int file_length = X*Y*Z;

    float myFunc(int i, float *param_1, float *param_2, float param_3);

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

    chunk_size = ceil(file_length / numtasks);

    /*  Allocate memory for the input parameters    */
    param_1 = malloc(file_length*sizeof(float));
    param_2 = malloc(file_length*sizeof(float));

    if( taskid == MASTER) {
        /* Read parameters from file (table_1, table_2, table_3, param_1)   */
    }

    MPI_Bcast(table_1,31*8,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(table_2,31*4,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(table_3,31*2,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(param_1,file_length,MPI_FLOAT,MASTER,MPI_COMM_WORLD);

    for(it = 0; it < 10; it++) {

        for(i = 0; i < chunk_size; i++) {
            chunk[i] = myFunc((taskid*chunk_size)+i, param_1, param_2, param_3);
        }

        MPI_Gather(chunk, chunk_size, MPI_FLOAT, param_2, chunk_size, MPI_FLOAT, MASTER, MPI_COMM_WORLD);

        MPI_Bcast(param_2, file_length, MPI_FLOAT, MASTER, MPI_COMM_WORLD);
    }

    MPI_Finalize();

    free(...);

    return 0;
} 

float myFunc(int i, float *param_1, float *param_2, float param_3) {
    /*  Using the global tables (table_1,table_2,table_3) and some localy declared variable */
    /*  No MPI function here, only Math functions   */
}  

如果您有解决方案,建议或评论,请与我分享,我将不胜感激,谢谢!

4

0 回答 0