从并行计算的角度对比,MPI 与 OpenMP 有什么区别

从并行计算的角度对比,MPI 与 OpenMP 有什么区别,第1张

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。

C语言利用数组计算超大整数的阶乘代码

#include <stdioh>

int main()

{

int n;

int a[9000]; //确保保存最终运算结果的数组足够大

int digit = 1; //位数

int temp; //阶乘的任一元素与临时结果的某位的乘积结果

int i, j, carry; //carry:进位

printf("please in put n:\n");

scanf("%d",&n);

a[0] = 1; //将结果先初始化为1

for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"

{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘

for( j=1, carry=0; j<=digit; j++ )

{

temp = a[j-1] i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)

a[j-1] = temp % 10; //更新临时结果的位上信息

carry = temp / 10; //看是否有进位

}

while(carry)

{ //如果有进位

a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1

carry = carry / 10; //看还能不能进位

}

}

printf("n ! = "); //显示结果

for(j = digit; j >=1;j--)

{

printf("%d",a[j-1]);

}

printf("\n");

return 0;

} #include <stdioh> int main() { int n; int a[9000]; //确保保存最终运算结果的数组足够大 int digit = 1; //位数 int temp; //阶乘的任一元素与临时结果的某位的乘积结果 int i, j, carry; //carry:进位 printf("please in put n:\n"); scanf("%d",&n); a[0] = 1; //将结果先初始化为1 for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场" { //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘 for( j=1, carry=0; j<=digit; j++ ) { temp = a[j-1] i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位) a[j-1] = temp % 10; //更新临时结果的位上信息 carry = temp / 10; //看是否有进位 } while(carry) { //如果有进位 a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1 carry = carry / 10; //看还能不能进位 } } printf("n ! = "); //显示结果 for(j = digit; j >=1;j--) { printf("%d",a[j-1]); } printf("\n"); return 0; }

并行编程环境:MPI

MPI是一种基于消息传递的并行编程技术,在不同节点计算机之间并行多进程执行程序(这种情况下,不同享内存),只是通过消息传递来进行通信,从而适用于分布式体系

以上就是关于从并行计算的角度对比,MPI 与 OpenMP 有什么区别全部的内容,包括:从并行计算的角度对比,MPI 与 OpenMP 有什么区别、MPI程序求阶乘,求数组最大值、计算机系统结构中mpi是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9803407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存