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