使用OpenMP,MPI混合编程解决WordCount问题

本文探讨了使用Map-Reduce、并行I/O和空间换时间三种思路解决分布式计算中的DigitCount问题,即统计64G大小的Int数组中每个元素出现的次数。在MPI和OpenMP混合编程下,通过优化数据结构和利用原子操作减少临界区冲突,实现了性能提升。实验结果显示,增加进程和线程数能显著提高计算速度,MPI的性能优化表现优秀。
摘要由CSDN通过智能技术生成

Word-Count 问题

WordCount是分布式计算的入门问题,但也是最基本和经典的问题. 问题是让你统计一个超级大的文件(可能上T级别), 里面的每个字符串各出现了多少次.

本文聚焦的并不是真正的WordCount问题,而是DigitCount, 即一个64G大小的Int数组,让你统计里面每个Int分别出现了多少次. 这也是我们并行计算课程的大作业.

思路1: Map-Reduce

刚开始自己对MPI的API还不够熟悉,所以Map-Reduce都是自己写的, 先通过主进程通过read读取数据,再通过scatter分发数据, 分发数据之后各个进程自己计算,然后最后通过子进程send, 根进程receive来统计结果(reduce过程)

这里写图片描述

如果作为Word Count问题来思考的话,是需要维护一个map<string, int>结构的,在这个问题中就是map<int, int>, 前一个int是出现的int,后一个是出现的次数.但是这样来做的话效率会比较低. 因为每次看到一个int都需要查Map并且进行累加, 累计时间复杂度O(NlogN). 并且由于需要传输一个Map, 需要重新定义传输结构:

void DigitCount::defineTransportStruct()
{

    MPI_Datatype oldtypes[2];
    int          blockcounts[2];
    // MPI_Aint type used to be consistent with syntax of
    // MPI_Type_extent routine
    MPI_Aint    offsets[2], extent;

    // setup description of the 1 MPI_INT fields num
    offsets[0] = 0;
    oldtypes[0] = MPI_LONG;
    blockcounts[0] = 1;
    // setup description of
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值