OpenMP和MPI是并行编程的两个手段,对比如下:
OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差。
MPI:进程级;分布式存储;显式;可扩展性好。OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂。
需要分析及划分应用程序问题,并将问题映射到分布式进程集合。需要解决通信延迟大和负载不平衡两个主要问题。
延伸论述:
我认为,要理解OpenMP和MPI,首先要有一些 *** 作系统知识和系统编程基础——OpenMP对应的实际上是单进程多线程的并发编程模型,可以将一个单线程的程序按for循环拆分成多线程——相当于pthread_create。
对于同一个进程的多个线程来说,由于它们只是独占自己的栈内存,堆内存是共享的,因此数据交换十分地容易,直接通过共享变量就可以进行交换,编程模型非常简单易用,并且对于 *** 作系统来说,线程的上下文切换成本也比进程低很多。
然而另一方面,由于线程不能脱离进程独立存在,而一个进程不能存在于多台机器上,所以OpenMP只适用于拥有多个CPU核心的单台电脑。并且多线程编程存在临界区(Critical Section),需要你自己去加锁,解决Race Condition问题,否则的话很容易导致不可预知的后果。
而MPI则是多进程的并发编程模型,相当于你自己调用fork——每一个进程的内存地址空间都是独立的,它们彼此之间几乎什么都不共享,只能通过进程间通信(IPC)来交换彼此的数据,因此编程难度明显要大很多。
MPI有一个非常显著的优点,那就是对于一个分布式系统来说,进程是可以在分布式系统的每一台电脑之间转移的,因此对于拥有多台电脑的分布式系统来说,其并发性要明显好于OpenMP。
!$OMP parallel shared(l,aa)
call lin_sol_gen(l,bb,aa)
!$OMP end parallel
这样确实是没意义的 这个并行效果只是让各个线程都执行这个语句而不是协同执行这个求解过程 而且aa(我猜是存储结果的矩阵)会因为多线程而数据竞争,最终可能反而计算时间更长
楼主要多线程协同计算矩阵就要找本身支持多线程的库, 我不知道IMSL里面那些函数和有什么开关能够运行并行库, 需要你自己找找
另一方面,线性方程求解还是用到lapack库的东西, 其实优化过的MKL(AMCL应该也有)是有并行库调用的有兴趣去intel官网查查MKL文档
1《The C Programming Language》(《C程序设计语言》) ¥30
(美)Brian WKernighan,Dennis MRitchie (K&R)著 机械工业出版社
>
《OPENMP编译原理及实现技术》百度网盘pdf最新全集下载:
链接:>pwd=t16g 提取码:t16g
简介:OpenMP制导指令将C语言扩展为一个并行语言,但OpenMP本身不是一种独立的并行语言,而是为多处理器上编写并行程序而设计的、指导共享内存,OpenMP编程模型以线程为基础,通过编译制导指令来显示地指导并行化
经典的么Michael Quinn 的 《MPI与Openmp并行程序设计》,太经典了,但绝版了,没pdf的,去复印吧。还有么Barry的并行程序设计,里面的调度算法讲得不错。还有机工的几本并行都不错的,不过很多都绝版了。
以过来人的建议千万别买陈国良的《并行计算》,完全抄袭黄凯的书!就算老师推荐也别买,谁买谁后悔!
希望对你有所帮助,来自一个硕士研究生朋友的建议。
OpenMP 是一种基于共享内存并行计算的编程模型,为了保证数据一致性,在编写多线程程序时需要采取一些措施来避免数据破坏。下面是一些用 OpenMP 编写多线程程序的一些基本技巧,以确保数据一致性和线程安全:
1 使用互斥锁(mutex):在对共享数据修改的关键区域使用互斥锁进行保护,以确保同一时间只有一个线程在修改共享数据,避免数据破坏。OpenMP 提供了几个内置指令来实现互斥锁,如 `omp_lock_t` 和 `omp_set_lock()`、`omp_unset_lock()` 等。
2 分配私有内存(private memory):在多线程程序中,每个线程都需要分配自己的内存空间,防止多个线程同时修改相同的内存地址,并导致数据破坏。可以使用 `private` 关键字将变量声明为私有变量,每个线程都有自己的一份拷贝,并在各自的线程中修改,而不会影响其它线程。
3 使用原子 *** 作:对一些简单的 *** 作,如递增和递减等,可以考虑使用原子 *** 作来保证线程安全,防止数据破坏。OpenMP 提供了几个内置指令来实现原子 *** 作,如 `omp_atomic`、`omp_atomic_read`、`omp_atomic_write`、`omp_atomic_capture` 等。
4 限制共享数据的访问范围:尽量将共享数据的访问范围限制在需要的代码段内,避免多个线程同时访问导致数据破坏。可以使用 `private` 关键字或将共享数据限制在 `parallel` 或 `for` 指令块内。
5 使用同步机制:在需要等待其它线程完成某些 *** 作时,可以使用 OpenMP 中提供的同步机制来进行线程同步。如 `omp barrier`、`omp flush`、`omp sections` 等。
总之,在使用 OpenMP 编写多线程程序时,需要注意保障数据一致性和线程安全,避免数据破坏。可以使用互斥锁、私有变量、原子 *** 作、限制访问范围和同步机制等技术手段,保证多线程程序的正确性和高性能。
以上就是关于从并行计算的角度对比,MPI 与 OpenMP 有什么区别全部的内容,包括:从并行计算的角度对比,MPI 与 OpenMP 有什么区别、请教IMSL里的函数如何用OpenMP进行并行处理、推荐几本好的C语言方面的书等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)