● 缓冲模式:MPI环境将消息复制到一个用户提供的缓冲区中,然后就立即返回,消息由MPI环境在后台执行。用户必须确保所提供的缓冲区能够容下将要发送的消息。缓冲模式下的发送操作不需要与接收方联络便可立即完成。
● 同步模式:同步模式是基于标准模式上,增加了一个要求。它要求确认接收方已经开始接收数据后函数调用才返回。
● 就绪模式:调用就绪模式发送时必须确保接收方已经正在等待接收该消息,不然就会产生错误。
3.3.2 MPI程序结构下面是C/C++语言MPI程序的典型结构:
#include "mpi.h"
........
int main(int argc, char *argv[])
{
int myrank, numprocs;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
......
MPI_Finalize();
......
return 0;
}
表3.1 MPI程序基本结构
C/C++语言的MPI程序必须包含MPI的头文件mpi.h,以获得MPI函数的原型说明和MPI的预定义数据类型和常量。在使用C++作为MPI程序编程语言的时候,在编译程序时可能会遇到以下的出错信息:
“SEEK_SET is #defined but must not be for the C++ binding of MPI”
这个问题是由于stdio.h和MPI C++接口同时都使用了SEEK_SET,SEEK_CUR,SEEK_END这些全局变量,这是MPI-2标准中的一个bug。要解决这个问题,一般会在#include “mpi.h”这句代码前加上以下三句:
#undef SEEK_SET
#undef SEEK_END
#undef SEEK_CUR
MPI_Init函数用于初始化MPI系统环境。该函数应该在调用其他所有MPI函数之前(除了MPI_Initialized)调用,不然MPI环境还没建立,其他函数也无法运行。命令行参数argc和argv可以传递给MPI_Init,因为有时可以通过这些参数将运行进程的相关信息传递给MPI程序。一般来说,调用MPI_Init(0, 0)也是足够的了。
函数MPI_Comm_size和MPI_Comm_rank分别返回指定通信器中的进程数目和本进程的进程号。在这个例子中,使用的通信器是MPI_COMM_WORLD,它包含了所有进程。
MPI_Finalize函数是用来退出MPI系统环境的。调用它之后便不能再调用任何其他的MPI函数了。程序的主体运行部分一般是在MPI_Finalize之前。进程可以通过myrank变量判断自己是哪个进程来执行不同进程所应该做的工作。
3.3.3 MPI编程的主从模式构成并行程序的进程中有一个主进程(通常是进程0)其余为从进程。主进程与从进程的分工是不同的。主进程的工作一般负责整个并行程序的控制,分配数据和任务给从进程,从进程负责数据的处理和计算工作,同时主进程也可以参与数据的处理和计算工作。
3.4 小结MPI的一个最重要的特点就是免费和源代码开放,MPI可以被迅速接受和它为自己定下的高效率、方便移植和功能强大三个主要目标密不可分。它采用广为使用的语言FORTRAN和C/C++进行绑定也是它成功的一个重要因素,当然MPI的成功还因为它总结和吸收了前期大量消息传递系统的经验。一个成功的标准是需要大量的实践和艰苦的努力的,MPI就是这种实践和努力的结果。
第四章 商立方体
联机分析处理(OLAP)由于要计算复杂的聚集函数,有很多的查询要从磁盘读取大量的数据,而OLAP的交互特性要求系统能快速地响应查询。为了解决这对矛盾,Gray等人提出了数据立方体(Data Cube)[GCB+97]。数据立方体概括了可能提出的所有的查询类型,并且将查询结果预先计算出来保存到磁盘。在响应查询时,通过查询重写把用户的查询转换为对某一个实例化视图的查询,极大地提高了查询响应速度。
近年来,随着数据仓库应用的广泛,数据仓库的数据量也越来越大,使得数据立方体的数据量也相应地急剧增加。数据立方体存在一个明显的缺陷:由于需要计算多个聚集函数对于所有可聚合属性的集合,数据立方体需要大量的计算和巨大的磁盘存储空间,不能很好地适用于多维度的场合。因此,减少数据立方体所占用的空间成为了一个关键问题。对此,人们纷纷提出了多种数据立方体的数据压缩技术。其中一类是基于数据立方体单元间关系的压缩技术,它们利用这些关系,如上卷、下钻等,通过分析发现单元间能够去除掉的冗余信息。这样,在将这些冗余信息去除掉之后,数据立方体的存储空间得到压缩并且数据立方体元组之间的关系得以保留,这类技术是目前数据立方体压缩存储技术的主流,代表着未来数据立方体压缩存储技术的发展趋势。
Wang等人提出了精简立方体(Condensed Cube)的概念[WLFY02],它其中有一个关键概念叫“Base Single Tuple(BST)”。它将具有相同BST的数据立方体单元归为同一类,仅仅存储BST和对应的单元集,其他不符合这些条件的元组则按原来的方式存储。通过去除相同BST的数据立方体单元间的冗余信息,精简立方体能够有效地减少数据立方体的数据量。
Y