【转】并行计算部分总结
1。计算机的峰值为主频x4。
2。计算机读取数组时,一次会读入一行,要最大限度的利用已读入的数据,减少频繁读写的次数。
3。多线程内存共享,多进程需要消息传递来交换变量。
4。利用管道在不同程序之间传递内容(可以是管道符|或mkfifo mypipe)
5。平均不同节点的计算量,尽量做到负载平衡。
6。数据分块是每块大小尽可能为cache的1/3。
7。MPI_CHAR 为一个字符,但不一定是一个字节。
8。在MPI_Init()之后再处理命令行参数。
9。MPI_Recive()出现在MPI_Send()前一定阻塞。
10。让计算和通信重叠进行,通常先等待receive的完成,然后做计算,再等待send的完成。
11。采用MPI_Test()检测传输是否结束时,需要再调用MPI_Wait()或MPI_Request_free(),指针释放后要置为空指针。
12。在分析复杂问题时,可简化为有限元分析。
13。分析并行程序要有并行的思想,看多个并发的结果,要考虑不同进程的速度对结果的影响。
14。尽量避免多个进程同时读写同一个变量,常用解决办法是加锁。
15。对于危险区域(可能涉及到多个进程的变量)要加上个障碍,然后看看去掉障碍后有什么影响。
16。保证等号左边的变量在任何进程是唯一的。
17。MPI无全局变量,各个变量分布在不同节点上,属于节点私有。因此在矩阵存储后,索引会发生变化。
18。ps auwx | grep myc可获得进程号 gdb myc pid(进程号)
19。c的程序可打印出进程号以便调试getpid() or getppid()。
20。在共享内存的并行机中所有的全局变量由不同的处理器共享,要避免对同一个变量的同一读写,加锁,栅栏。
21。栅栏能够使不同的进程同步,当一个进程到达栅栏时,它等待所有的相关进程到达栅栏再继续执行,避免了不同程序的赛跑比赛。
22。并行程序多为数据并行,程序中的循环是并行的出发点,有时候循环中的并行需要通过转换才比较明显,要有好的任务调度。
23。降低进程中依赖性的方法:采用局部变量,代码转换,采用特殊的调度技术。
24。数组间接索引时不能保证数组的元素不具有重复。
25。MPI编程子程序会被拷贝到每个处理器上。
26。定义数据类型可以使数据作为一个整体进行发送,减少通信开销。
27。数据在内存中存放时按块进行,内存线读取数据时也是读取一定宽度的数据。因此要保证数据存放在一个快中。
28。32位系统double的对界量是4。
29。定义结构体时,让长数据类型在前,短数据类型最好为4的倍数。
30。MPI_Aint一种数据类型,
31。两个数据等效是指这两个数据在内存中分布相同,上下界一样。
32。prev = (nprocs + myrank - 1) % nprocs; next = (myrank + 1) % nprocs;(myrank为当前进程号,nprocs为总进程数)
33。并行计算的效率达到100%甚至更高时的原因是减少了数据在硬盘个内存中多次读取,利用并行机的大内存节省时间。
34。SMP(shared memory processors)共享内存的并行机上并行的关键是减少同步、负载平衡。
35。数据类型的域表示数据被访问一次之后在内存中的偏移量,与数据类型的大小没有直接关系,可通过MPI_UB的偏移量来设定域指定数据的相对移动。
--------2010。06。08更新--------------
36。MPI_Sendrecv(dst,src)的dst是指本进程发送出去的目的地,src是指本进程接收数据的源地址。
37。发送连续的数据类型时,下个数据的起始为紧邻前一个数据末尾的后一个元素。
----------------------------------------------------------------
MPI
20。阻塞型函数需要等待指定操作的实际完成,或至少涉及的数据已被MPI系统安全地备份后才返回。MPI_Send调用返回时表明数据已被发出或被MPI系统复制,随后对发送缓冲区的修改不会改变所发送的数据。而MPI_Recv返回时表明数据接收已经完成。阻塞型函数的操作是非局部的,它的完成可能需要与其它进程进行通信。阻塞型函数使用不当容易引起死锁。非阻塞型函数的调用总是立即返回,而实际操作则由MPI系统在后台进行。用户必须随后调用其它函数来等待或查询操作的完成情况。在操作完成前对相关数据区的操作是不安全的,因为随时可能与正在后台进行的操作发生冲突。非阻塞型函数的调用是局部的,因为它的完成不需要与其它进程进行通信。可以实现计算与并行的重叠进行。
21。一个MPI数据类型由两个n元序列构成,n为正整数,第一个序列包含一组数据类型,称为类型序列Typesig = {type0,type1,……,typen}.第二个序列包含一组整数位移,称为位移序列Typedisp = {disp0,disp1,……,dispn}。位移序列中位移总是以字节为单位计算的。类型序列刻划了数据的类型特征,位移序列刻划了数据的位置特征。类型序列和位移序列的元素一一配对构成的序列Typemap = {(type0,disp0),(type1,disp1),……,(typen,dispn)}称为类型图。假设数据缓冲区的起始地址为buff,则由上述类型图所定义的数据类型包含n+1快数据,第i块的地址为buff+dispi,类型为typei。
22。位移序列中的位移不必是单调上升的,表明数据类型中的数据块不要求按顺序存放。位移也可以是负的,即数据类型中的数据可以位于缓冲区起始地址之前。
23。数据类型的大小指该数据类型中包含的数据长度(字节数),它等于类型序列中所有基本数据类型的大小之和。数据类型的大小就是消息传递时需要发送或接收的数据长度。
24。数据类型的下界定义为数据的最小位移。数据类型的上界定义为数据的最大位移加1,再加上个使得数据类型满足操作系统地址对界要求的修正量。数据类型的域定义为上界与下界之差。
25。一个数据类型的对界量定义如下:原始数据类型的对界量由编译系统决定,而复合数据类型的对界量则定义为它的所有基本数据类型的对界量的最大值。地址对界要求指一个数据类型在内存中的(字节)地址必须是它的对界量的整数倍。
26。MPI_Type_vector和MPI_Type_hvector唯一的区别是前者的stride以oldtype的域为单位,后者以字节为单位。前者的可移植性更强。
27。以字节作位移通常是不可移植的,用字节作位移单位时使用MPI_Aint,是相对于缓冲区的偏移量。
28。MPI_Type_indexed与MPI_Type_vector的区别在于每个数据块的长度可以不同,数据块间也可以不等距。
29。MPI_Type_struct与MPI_Type_hindexed的区别在于各数据块可以由不同的数据类型构成,处理不同类型时只能用struct。
30。数据类型使用之前要提交,用完要释放。中间类型可不用提交,同时一旦创建了下一个数据类型,即可将其依赖类型释放。
31。相邻两个数据块的位移差为两个数据块头到头的位移差。
32。MPI_Pack常用于少量的混乱的发送次数少的数据,数据在打包、拆包前position都需要初始化为零。
33。经过MPI_Pack打包后的数据发送时MPI_Send中的count为缓冲区的字节数。
34。MPI_Pack_size返回一个数据打包后的大小,可用来计算所需的缓冲区的长度。
35。聚合通信函数要求所有进程都调用。
36。MPI_Gather中recvcount为每个进程收到的数,而不是全体进程count求和。
37。MPI_Alltoall相当于将数据/进程进行依次转置。假设一个二维数组按行分块存储在各个进程中,则调用该函数可很容易地将它变成按列分块存储在各进程中。
本文转自CSDN博客http://blog.csdn.net/qazplm12_3/article/details/5649741
作者:Parallel Life
出处:http://www.cnblogs.com/Parallel-Life/
同步博客:http://metman.info/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
如有问题,可以通过jiangqingu@gmail.com 联系我,非常感谢。
posted on 2012-03-19 20:09 Parallel Life 阅读(1377) 评论(0) 编辑 收藏 举报