广播后其他处理器阵列中的错误元素(MPI)

时间:2018-04-14 13:26:37

标签: mpi

我正在尝试将指向x的指针广播到其他处理器。它与errnum一起被声明为全局变量。但是在广播之后,除rank 0之外的所有处理器的数组内容都不正确,而errnum被正确读取。

我在上限中添加了注释,以指出我在上面提到的内容。无论排名如何,底部打印循环在广播后都会提供正确的errnum值,但如果排名为x0的内容才会正确。谁知道为什么?

注意:我不熟悉C,但是数组的元素似乎已经正确填充,因为进程0能够访问数组并从中读取正确的元素。

示例输入......

3 
5.05
2 3 4

如果我将等级设为0 ...

,则输出
3
0.010000
0 2.000000
1 3.000000
2 4.000000

如果我将等级设置为1 ...

,则输出
3
0.010000
0 1209010463764815312582472227618816.000000
1 18988728894356880079764586496.000000
2 78657026497739634549916490384015360.000000

和代码..

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


float err; 
float *x;  // DECLARING X HERE
int num;

void get_input();  


void get_input(FILE* fp, int process_rank, int comm_size)
{
    if(process_rank == 0)
    {
        x = (float *)malloc(num * sizeof(float));

        for(int i = 0; i < num; i++) {
            fscanf(fp, "%f", &x[i]);
        }

        // BROADCASTING X
        MPI_Bcast(&x, num, MPI_FLOAT, 0, MPI_COMM_WORLD);

        fclose(fp);
    }
}


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

    fp = fopen(argv[1], "r");
    if (!fp)
    {
        printf("Cannot open file %s\n", argv[1]);
        exit(1);
    }    
    fscanf(fp, "%d ", &num);
    fscanf(fp, "%f ", &err);

    int comm_size;
    int process_rank;
    x = (float *)malloc(num * sizeof(float));  /* The unknowns */

    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &process_rank);

    MPI_Bcast(&num, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(&err, 1, MPI_FLOAT, 0, MPI_COMM_WORLD);

    get_input(fp, process_rank, comm_size);

    // CHECKING X
    if(process_rank == 1) {
        printf("%d\n", num);
        printf("%f\n", err);
        for(int i = 0; i < num; i++) {
            printf("%d %f\n", i, x[i]);
        }
    }

    MPI_Finalize();

    return(0);
}

1 个答案:

答案 0 :(得分:1)

MPI_Bcast()的第一个参数是指向缓冲区的指针,而不是指向缓冲区的指针的地址。

因此,您需要将MPI_Bcast(&x, ...);替换为MPI_Bcast(x, ...);

您还需要在所有排名上分配xMPI_Bcast()。 这是更正后的get_input()函数

void get_input(FILE* fp, int process_rank, int comm_size)
{
    x = (float *)malloc(num * sizeof(float));

    if(process_rank == 0)
    {
        for(int i = 0; i < num; i++) {
            fscanf(fp, "%f", &x[i]);
        }
    }

    // BROADCASTING X
    MPI_Bcast(x, num, MPI_FLOAT, 0, MPI_COMM_WORLD);

    fclose(fp);
}

话虽这么说,你可能想要修改你的代码,只有等级0打开/读取/关闭输入文件。