MPI并行化一个函数
我想并行化一个数值积分函数。我想在计算中使用这个函数。之前的工作应该在根进程中完成。这可以在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
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