导航:首页 > 编程语言 > openmp编程实例

openmp编程实例

发布时间:2022-09-05 02:28:53

Ⅰ 如何建立Openmp编程环境

OpenMP在Windows环境下比较容易实现,只要打开VS2008中的编译选项/openmp,设置一下环境变量OMP_NUM_THREADS就可以了。
一般是新建一个c++项目,以次选择Project -> (alt+f7)属性 -> 配置属性(configuration property) -> c/c++ -> 语言(Language),打开OpenMP支持;

设置环境变量:我的电脑 -> 属性 -> 高级 -> 环境变量,新建一个OMP_NUM_THREADS变量,值设为2,即为程序执行的线程数。

至于其它环境变量,在使用的时候我们再设置就可以了,所以暂时不考虑。这样,就可以进行OpenMP程序设计了。

测试例子1:

#include "omp.h"

int main(int argc, char* argv[])
{

#pragma omp parallel
for(;;)
{
int i = 0 ;
i++;
int y = i;
}
return 0;
}

可以在任务管理器中看到CPU跑到100%。

测试例子2:

#include <stdio.h>
#include <omp.h>

int main()
{

omp_set_num_threads(2);

#pragma omp parallel

printf("Hello from Thread NO.%d\n", omp_get_thread_num());

return 0;

}

程序运行结果为:
Hello from Thread NO.0
Hello from Thread NO.1

Ⅱ 在Linux进行C语言编程的时候,程序里使用了mpi或者openmp或者都使用了该怎么进行编译执行谢谢

mpi或者openmp
这个,你指的是库?
如果是的话,编译时,加上链接库的编译选项就可以。
比如 gcc -hello.c -o hello -lm -lxml -L/usr/local/lib -lts
-lm 链接了math库
-lxml链接了xml库
-L/usr/local/lib -lts 链接了ts库,ts库存在目录/usr/local/lib中

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

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。

Ⅳ 用openmp并行编程计算100的阶乘

OpenMP:
#include <iostream>
#include <mpi.h>
int main( int argc, char** argv ){
int mynode, numnodes;
int sum, startval, endval, accum;
MPI::Status status;
MPI::Init( argc, argv );
numnodes = MPI::COMM_WORLD.Get_size();
mynode = MPI::COMM_WORLD.Get_rank();
sum = 0;
startval = 1000*mynode/numnodes+1;
endval = 1000*(mynode+1)/numnodes;

for( int i=startval; i<=endval; ++i ){
sum = sum + i;
}
if( mynode != 0 ){
MPI::COMM_WORLD.Send( &sum, 1, MPI::INT, 0, 1 );
}
else{
for( int j=1; j<numnodes; ++j ){
MPI::COMM_WORLD.Recv( &accum, 1, MPI::INT, j, 1,
status );
sum = sum + accum;
}
}
if( mynode == 0 )
std::cout << "The sum from 0 to 1000 is: " << sum
<< std::endl;
MPI::Finalize();
}

Ⅳ 用fortran语言进行高斯消去法的openmp的并行编写,但是结果却不正确,求解

并行程序段中,要求前后左右计算没有关联。
比如你要对屏幕上的任何一个点与字符A做异或运算,这些点的运算之间是没有关联的,这时你可以安排进行并行计算。

Ⅵ 在Linux系统上如何进行openmp多线程编程

多线程的使用主要是用来处理程序“在一部分上会阻塞”,“在另一部分上需要持续运行”的场合。一般是根据需求,可以用多线程,事件触发,callback等方法达到。但是有一些方法是只有多线程能办到的就只有用多线程或者多进程来完成。

Ⅶ 用OpenMP并行编程计算sum=1+2+3+.....N 用MPI并行编程计算sum=1+2+3+......N

OpenMP:

#include"omp.h"

constintN=100;

voidmain()
{
intsum=0;
#pragmaompparallelfor
for(inti=0;i<N;i++)
sum+=i;
print("Resultofadding1to%dis:%d",N,sum);
}

MPI:

#include<iostream>
#include<mpi.h>
intmain(intargc,char**argv){
intmynode,numnodes;
intsum,startval,endval,accum;
MPI::Statusstatus;
MPI::Init(argc,argv);
numnodes=MPI::COMM_WORLD.Get_size();
mynode=MPI::COMM_WORLD.Get_rank();
sum=0;
startval=1000*mynode/numnodes+1;
endval=1000*(mynode+1)/numnodes;

for(inti=startval;i<=endval;++i){
sum=sum+i;
}
if(mynode!=0){
MPI::COMM_WORLD.Send(&sum,1,MPI::INT,0,1);
}
else{
for(intj=1;j<numnodes;++j){
MPI::COMM_WORLD.Recv(&accum,1,MPI::INT,j,1,
status);
sum=sum+accum;
}
}
if(mynode==0)
std::cout<<"Thesumfrom0to1000is:"<<sum
<<std::endl;
MPI::Finalize();
}
阅读全文

与openmp编程实例相关的资料

热点内容
unix网络编程卷4 浏览:806
找靓机app下单什么时候发货 浏览:411
android一个应用两个进程 浏览:801
linux硬盘复制 浏览:806
php图片服务器搭建 浏览:798
下载压缩文件怎么打开 浏览:192
新建文件夹叫什么名字 浏览:565
windows20的开机命令 浏览:332
微信一般在电脑的那个文件夹 浏览:509
go在win7下编译特别慢 浏览:256
光遇ios耳机安卓为什么没有 浏览:904
小米手机桌面文件夹经常自动散开 浏览:607
小米电话手表用什么app进行设置 浏览:265
虚拟打印机pdf下载 浏览:671
jdk编译运行方法 浏览:459
android执行shell命令 浏览:349
程序员头像女 浏览:57
有什么可以变头发颜色的app 浏览:935
玩具解压屋游戏下载 浏览:849
我的世界拔刀剑服务器地址id 浏览:891