flying_rind 2022-12-02 18:55
浏览 4
已结题

在windows下的mpi环境中程序运行异常,sos

windows上的mpi运行时不报错一直卡住

我在windows上的mpi环境下编写了一个简单的并行程序,并在0号进程中进行输入并将输入传递给各个进程。
将此程序放到linux系统下可以正常运行,但在windows系统中不会报错运行后没有任何输入输出,程序卡住。完整代码如下,请dl帮我解答。
并且如果将代码中的Get_input(int my_rank,int comm_sz,double* a_p,double* b_p,int* n_p)这一行去掉,则程序正常运行。


```c
#include<stdio.h>
#include<string.h>
#include<mpi.h>


double f(double x){
    return x*x;
}

double Trap(
        double left_endpt,
        double right_endpt,
        int    trap_count,
        double base_len){
    double estimate, x;
    int i;

    estimate = (f(left_endpt) + f(right_endpt)) / 2.0;
    for(i=1; i <= trap_count-1; i++){
        x = left_endpt + i*base_len;
        estimate += f(x);
    }
    estimate = estimate*base_len;

    return estimate;
}

void Get_input(int my_rank,int comm_sz,double* a_p,double* b_p,int* n_p){
    int dest;
    
    if(my_rank == 0){
        printf("Enter a, b, and n\n");
        scanf("%lf %lf %d",a_p, b_p, n_p);
        for(dest = 1; dest < comm_sz; dest++){
            MPI_Send(a_p, 1, MPI_DOUBLE, dest, 0, MPI_COMM_WORLD);
            MPI_Send(b_p, 1, MPI_DOUBLE, dest, 0, MPI_COMM_WORLD);
            MPI_Send(n_p, 1, MPI_INT, dest, 0, MPI_COMM_WORLD);
        }
    }else{
        MPI_Recv(a_p, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD,
            MPI_STATUS_IGNORE);
        MPI_Recv(b_p, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD,
            MPI_STATUS_IGNORE);
        MPI_Recv(n_p, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
            MPI_STATUS_IGNORE);
    }
}

int main(void){
    int my_rank, comm_sz, n = 1024, local_n;
    double a = 0.0,b = 3.0, h, local_a, local_b;
    double local_int, total_int;
    int source;

    MPI_Init(NULL, NULL);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);

    Get_input(my_rank, comm_sz, &a, &b, &n);

    h = (b-a) / n;
    local_n = n/comm_sz;

    local_a = a + my_rank * local_n * h;
    local_b = local_a + local_n * h;
    local_int = Trap(local_a, local_b, local_n, h);

    if(my_rank != 0){
        MPI_Send(&local_int, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
    }
    else{
        total_int = local_int;
        for(source = 1; source < comm_sz; source++){
            MPI_Recv(&local_int, 1, MPI_DOUBLE, source, 0,
            MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            total_int += local_int;
        }
    }

    if(my_rank == 0){
        printf("With n = %d trapezoids, our estimate\n", n);
        printf("of the integral from %f to %f = %.15e\n",
            a, b, total_int);
    }
    MPI_Finalize();
    return 0;
} 


```

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月10日
    • 创建了问题 12月2日

    悬赏问题

    • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
    • ¥30 电脑误删了手机的照片怎么恢复?
    • ¥15 (标签-python|关键词-char)
    • ¥15 python+selenium,在新增时弹出了一个输入框
    • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
    • ¥20 学生成绩管理系统设计
    • ¥15 来一个cc穿盾脚本开发者
    • ¥15 CST2023安装报错
    • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
    • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了