MPI程序什么都不做 - 在linux

时间:2015-11-27 04:39:35

标签: linux mpi

我在linux上编写了这个MPI C程序。主设备应该向从设备发送任务并从从设备接收数据(如果还有更多任务要将它们提供给完成的从设备)。

完成所有任务后,应该打印一个解决方案。

它什么都没打印,我无法弄明白为什么。它没有卡住,它只是在一秒钟后完成并且不打印任何东西。

P.S- 我已经通过在代码中的不同位置放置printf来尝试调试。 打印内容的代码中唯一的位置是在主节中的MPI_Recv之前,它打印了几次(少于进程数)。

这是完整的代码:

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

#define NUMS_TO_CHECK 2000
#define RANGE_MIN -5
#define RANGE_MAX 5

#define PI  3.1415
#define MAX_ITER 100000

double func(double x);

int main (int argc, char *argv[])
{
    int numProcs, procId;
    int errorCode= MPI_ERR_COMM;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
    MPI_Comm_rank(MPI_COMM_WORLD, &procId);
    MPI_Status status;
    int i;
    double recieve=0;
    int countPositives=0;
    double arr[NUMS_TO_CHECK];
    double difference= (RANGE_MAX - RANGE_MIN) / NUMS_TO_CHECK;
    int counter = NUMS_TO_CHECK-1; //from end to start...
    //Initiallizing the array.
    for(i=0; i<NUMS_TO_CHECK; i++){
        arr[i]=RANGE_MIN+i*difference;
    }
    //master
    if(procId==0){
        //Send tasks to all procs
        for(i=1; i<numProcs; i++){
            MPI_Send(&arr[counter], 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
            counter--;
        }
        do{
            MPI_Recv(&recieve, 1, MPI_DOUBLE, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
            if(recieve>0) 
            {
                countPositives++;
            }
            MPI_Send(&arr[counter], 1, MPI_DOUBLE, status.MPI_SOURCE, 0, MPI_COMM_WORLD);
            counter--;

        }while(counter>0);

        printf("Number of positives: %d", countPositives);
        MPI_Finalize();

    }
    //slaves
    else{
        MPI_Recv(&recieve, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        recieve=func(recieve);
        MPI_Send(&recieve, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);


    }

}

double func(double x) 
{
    int i;
    double value = x;
    int limit = rand() % 3 + 1;

    for(i = 0;  i < limit * MAX_ITER;  i++)
        value = sin(exp(sin(exp(sin(exp(value))))) - PI / 2) - 0.5;

    return value;
}

2 个答案:

答案 0 :(得分:2)

我认为你的奴隶需要在while循环中读取数据。他们只做1次接收和1次发送。而大师从2000年开始。这可能是设计,所以我可能是错的。

答案 1 :(得分:0)

原则上,您的代码看起来几乎没问题。这里只缺少两件事:

  1. 最明显的一个是奴隶一方的循环,接收主人的指示,然后发回他们的工作;和
  2. 不太明显,但同样重要:主人告诉你什么时候完成工作。它可能是一个特殊的值发送,由从属测试,并导致它们在接收时存在recv + work + send循环,或者您测试的其他标记。在后一种情况下,您必须使用MPI_ANY_TAG作为奴隶方的接听电话。
  3. 考虑到这一点,我相信你可以让你的代码工作。