MPI学习-规约函数MPI_Reduce

MPI学习-规约函数MPI_Reduce全局规约函数MPI_Reduce:_mpi_reduce

全局规约函数MPI_Reduce:
将所有的发送信息进行同一个操作。

语法规则:

int MPI_Reduce(
void *input_data, /*指向发送消息的内存块的指针 */
void *output_data, /*指向接收(输出)消息的内存块的指针 */
int count,/*数据量*/
MPI_Datatype datatype,/*数据类型*/
MPI_Op operator,/*规约操作*/
int dest,/*要接收(输出)消息的进程的进程号*/
MPI_Comm comm);/*通信器,指定通信范围*/

规约操作(operator):
opration

举例:用MPI实现梯形积分
MPI学习-点对点通信学习了使用点对点通信函数MPI_Send,MPI_Recv实现函数y= sin x 的梯形积分,下面用聚合函数重新实现:

#include "stdafx.h"
#include <iostream>
#include<math.h>
#include "mpi.h"
using namespace std;
const double a = 0.0;
const double b = 3.1415926;
int n = 100;
double h = (b - a) / n;
double trap(double a, double b, int n, double h)
{
    double*x = new double[n + 1];
    double*f = new double[n + 1];
    double inte = (sin(a) + sin(b)) / 2;
    for (int i = 1; i<n + 1; i++) {
        x[i] = x[i - 1] + h;
        f[i] = sin(x[i]);
        inte += f[i];
    }
    inte = inte*h;
    return 0;
}
int main(int argc, char * argv[])
{
    int myid, nprocs;
    int local_n;
    double local_a;
    double local_b;
    double total_inte;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);   /* get current process id */
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* get number of processes */
    local_n = n / nprocs;
    local_a = a + myid*local_n*h;
    local_b = local_a + local_n*h;
    double local_inte = trap(local_a, local_b, local_n, h);

    /* @local_inte:send buffer; @total_inte:receive buffer; @MPI_SUM:MPI_Op; @dest=0,rank of the process obtaining the result. */

    MPI_Reduce(&local_inte, &total_inte, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    if (myid == 0)
    {
        printf("integral output is %d", total_inte);
    }
    MPI_Finalize();
    return 0;
}

今天的文章MPI学习-规约函数MPI_Reduce分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/77972.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注