Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI并行化一个函数_Mpi - Fatal编程技术网

MPI并行化一个函数

MPI并行化一个函数,mpi,Mpi,我想并行化一个数值积分函数。我想在计算中使用这个函数。之前的工作应该在根进程中完成。这可以在MPI中实现吗 double integral_count_MPI(double (*function)(double) , double beginX, double endX, int count) { double step, result; int i; if (endX - beginX <= 0) return 0; step = (endX

我想并行化一个数值积分函数。我想在计算中使用这个函数。之前的工作应该在根进程中完成。这可以在MPI中实现吗

 double integral_count_MPI(double (*function)(double) , double beginX, double endX, int      count)
 {
    double step, result;
    int i;
    if (endX - beginX <= 0) return 0;
    step = (endX - beginX) / count;
    result = 0;

    double *input = (double*)malloc((count+1) *sizeof(double));
    for (i = 0; i <= count; i ++)
    {
       input[i] = beginX + i*step;
    }
    // Calculate and gather
 }

您可以找到MPI文档

基本上,逻辑如下:

int main()
{
    MPI_INIT(...);
    MPI_Comm_size(...);    //get the number of processes
    MPI_Comm_rank(...);    //get my rank

    if (rank == 0)     //master process
    {
        for (i = 1; i < n; i++)
            MPI_Send(...) //Send interval data specific to i process

        double result = 0;
        for (i = 1; i < n; i++)
        {
            double part_result;

            MPI_Recv(&part_result, ...) //Receive partial results from slaves

            result += part_result;
        }

        // Print result
    }
    else               //slave process
    {
        MPI_Recv(...)  //Receive interval data from master (rank 0 process)

        double result = integral_count_MPI(...);

        MPI_Send(...)  // Send results to master
    }

    MPI_FINALIZE(...);
}
intmain()
{
MPI_INIT(…);
MPI_Comm_size(…);//获取进程数
MPI_Comm_rank(…);//获取我的排名
if(rank==0)//主进程
{
对于(i=1;i
您可以找到MPI文档

基本上,逻辑如下:

int main()
{
    MPI_INIT(...);
    MPI_Comm_size(...);    //get the number of processes
    MPI_Comm_rank(...);    //get my rank

    if (rank == 0)     //master process
    {
        for (i = 1; i < n; i++)
            MPI_Send(...) //Send interval data specific to i process

        double result = 0;
        for (i = 1; i < n; i++)
        {
            double part_result;

            MPI_Recv(&part_result, ...) //Receive partial results from slaves

            result += part_result;
        }

        // Print result
    }
    else               //slave process
    {
        MPI_Recv(...)  //Receive interval data from master (rank 0 process)

        double result = integral_count_MPI(...);

        MPI_Send(...)  // Send results to master
    }

    MPI_FINALIZE(...);
}
intmain()
{
MPI_INIT(…);
MPI_Comm_size(…);//获取进程数
MPI_Comm_rank(…);//获取我的排名
if(rank==0)//主进程
{
对于(i=1;i
MPI提供了各种方法来构建“幕后”使用它的库。对于初学者,您可以根据需要初始化MPI。MPI-2修改了调用
MPI_Init
的要求,因此每个符合要求的实现都应该能够使用
NULL
参数正确初始化
MPI_Init
(因为库可能无法使用实际的程序参数)。由于MPI只能初始化一次,因此库必须通过调用
MPI\u Initialized
检查它是否已初始化。代码基本上如下所示:

void库_init(void)
{
int标志;
MPI_已初始化(&标志);
如果(!inited)
{
MPI_Init(NULL,NULL);
atexit(图书馆);
}
}
初始化代码还通过从C标准库调用
atexit()
来注册退出处理程序。在此退出处理程序中,如果尚未完成MPI库,它将完成MPI库。如果不这样做,可能会导致
mpiexec
终止整个MPI作业,并显示一条消息,表明至少有一个进程已退出而没有完成MPI:

void库\u onexit(void)
{
int标志;
MPI_最终确定(&flag);
如果(!标志)
MPI_Finalize();
}
这种安排允许您编写
积分\u计数\u MPI
函数,如下所示:

二重积分\u计数\u MPI(…)
{
库_init();
…MPI计算。。。
}
integral\u count\u MPI
将在第一次调用时要求初始化MPI库。由于
library\u init
的编写方式,以后的调用不会导致重新初始化。此外,无需明确的最终决定-出口处理人员将负责


请注意,您仍然需要通过MPI进程启动器(
mpirun
mpiexec
等)启动代码,并且在执行I/O时必须小心,因为代码的串行部分将在每个实例中执行。许多启用MPI的库为此提供了自己的I/O例程,这些例程在进程级别上进行过滤,只允许级别0执行实际I/O。您还可以使用MPI的动态进程管理功能根据需要生成其他进程,但这需要您将流程管理的很大一部分抽象到执行集成的库中,这将使其变得非常复杂(主程序的代码看起来会很笨拙)。

MPI提供了各种方法来构建“幕后”使用它的库。对于初学者,您可以根据需要初始化MPI。MPI-2修改了调用
MPI_Init
的要求,因此每个符合要求的实现都应该能够使用
NULL
参数正确初始化
MPI_Init
(因为库可能无法使用实际的程序参数)。由于MPI只能初始化一次,因此库必须通过调用
MPI\u Initialized
检查它是否已初始化。代码基本上如下所示:

void库_init(void)
{
int标志;
MPI_已初始化(&标志);
如果(!inited)
{
MPI_Init(NULL,NULL);
atexit(图书馆);
}
}
初始化代码还通过从C标准库调用
atexit()
来注册退出处理程序。在此退出处理程序中,如果尚未完成MPI库,它将完成MPI库。如果不这样做,可能会导致
mpiexec
终止整个MPI作业,并显示一条消息,表明至少有一个进程已退出而没有完成MPI:

void库\u onexit(void)
{
int标志;
MPI_最终确定(&flag);
如果(!标志)
MPI_Finalize();
}
这种安排允许您编写
积分\u计数\u MPI
函数,如下所示:

二重积分\u计数\u MPI(…)
{
库_init();
…MPI计算。。。
}
integral\u count\u MPI
将在第一次调用时要求初始化MPI库。以后的调用不会导致rein