并行编程模式
对等模式—程序的各个部分地位相同,功能和代码基本一致,只是处理的数据或对象不同;主从模式—程序通信进程之间的一种主从或依赖关系 。
点对点通信模式
阻塞—发送完成的数据已经拷贝出发送缓冲区,即发送缓冲区可以重新分配使用,阻塞接受的完成意味着接收数据已经拷贝到接收缓冲区,即接收方已可以使用。非阻塞—在必要的硬件支持下,可以实现计算和通信的重叠。4种通信模式:标准通信模式、缓存通信模式、同步通信模式、就绪通信模式 。颤模
组通信
一个特定组内所有进程都参加全局的数据处理和通信 *** 作 。
功能:通信—组内数据的传输;同步—所有进程在特定的点上取得一致;计算—对给定的数据完成一定的 *** 茄搏缓作 。
类型:1)数据移动:广播(mpi bcast) 收集(mpi gather) 散射(mpi scater)组收集(mpi all gather)全交换银敬(all to all);2)聚集:规约(mpi reduce)将组内所有的进程输入 缓冲区中的数据按,定 *** 作OP进行运算,并将起始结果返回到root进程的接收缓冲区扫描(mpi scan)要求每一个进程对排在它前面的进程进行规约 *** 作,结果存入自身的输出缓冲区;3)同步:路障(mpi barrier)实现通信域内所有进程互相同步,它们将处于等待状态,直到所有进程执行它们各自的MPI-BARRIER调用 。
mpi生成随机数组并进行排序:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
按照我的理解其实很简单,比较两个相邻数数茄没据的大小,如果满足大小关系,则数据不变动,否者将他们的位置互换,所以,一次冒泡完毕之后,至少一个数据已经移动到它该待的位置,所以像对n个数据排序,那么只需要进行n(或者n-1)次冒泡即可得到最终的排序结果。
我们来举个例子,现在有一组数据:6,5,4,3,2,1,我们现在需要将这些数据从小到大排序。
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插薯纳入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本 *** 作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。
插入排序的基本思想是:每步将一个待排序的记录,按纳羡其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
随机排序: 第一次:18395 ms 第二次:17758 ms 第三次:17792 ms插入排序: 第一次:1098 ms 第二次:1124 ms 第三次:1093 ms选择排序: 第一次:5776 ms 第二次:6432 ms 第三次:5367 ms
MPI(MPI是一个标准,有不同的具体实现,比如MPICH等)是多主机联网协作进行并行计算的工族毕具,当然也可以用于单主机上多核/多CPU的并行计算,不过效率低。它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。缺点是使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。OpenMP是针对单主机上山闷多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算逗穗弯。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算!如果要多主机联网使用OpenMP(比如在超级计算机上),那必须有额外的工具帮助,比如MPI+OpenMP混合编程。或者是将多主机虚拟成一个共享内存环境(Intel有这样的平台),但这么做效率还不如混合编程,唯一的好处是编程人员可以不必额外学习MPI编程。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)