【系列讲座】OpenMP 入门

intel_jeff 2008-05-12 04:48:04
加精
OpenMP是一个业界的标准,很早以前就有了,只是近一段时间才逐渐热起来。我们可以在C/C++和Fortran使用OpenMP、很容易的引入多线程。


OpenMP目前的标准是2.5,3.0马上也要通过了。官方网站www.openmp.org上有你需要知道的一切信息,包括OpenMP规范文档。



下图是一个典型的OpenMP程序的示意图,我们可以看到它是由串行代码和并行代码交错组成的,并行代码的区域我们把它叫做“并行区”。主线程一旦进入并行区,就自动产生出多个线程,来并行的执行。



怎样在我们的代码中使用OpenMP呢?很简单,拿我们常用的C/C++代码来说,只需要插入如下pragma,然后我们选择不同的construct就可以完成不同的功能。



(待续。。。)
...全文
11179 100 打赏 收藏 转发到动态 举报
写回复
用AI写文章
100 条回复
切换为时间正序
请发表友善的回复…
发表回复
modong 2011-03-18
  • 打赏
  • 举报
回复
额哦~~第一次回帖,看了,lz很强大~
guluyiyi 2010-11-30
  • 打赏
  • 举报
回复
QIANG!
jiaon 2010-10-14
  • 打赏
  • 举报
回复
对递归算法起作用吗?
fengpei9 2010-10-02
  • 打赏
  • 举报
回复
您好!想请问下如何合理有效的使用多核系统中的多级缓存?谢谢
a408498863 2010-09-19
  • 打赏
  • 举报
回复
看不懂
zuopaide 2010-09-19
  • 打赏
  • 举报
回复
相见恨晚啊
geniusufo 2010-08-08
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
anxin821 2010-08-05
  • 打赏
  • 举报
回复
openMP能在c++builder 6 中用么?
dengxiaer 2010-08-03
  • 打赏
  • 举报
回复
我用openMP写了一个程序,刚开始几秒的执行速度很快,然后速度就开始下降,这是什么原因啊?
东子于 2010-07-08
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
成都-hero 2010-05-10
  • 打赏
  • 举报
回复
请问OpenMP支持跨平台开发吗?
teribithia 2010-05-08
  • 打赏
  • 举报
回复
小弟在Linux下写了一个简单的omp程序,大体结构是
while(1)
{
#pragma omp parallel for
for(int i=0; i<4; i++)
{
//数据处理
}
//显示此次循环的时间
sleep(n);
}
数据处理代码是不相关的,或者都注释掉也行,应该只是线程开销比较大。主要问题是sleep时间不同的时候,主线程CPU使用率不同,但是子线程的cpu使用率一直接近100%,使得整体的CPU使用率很高。但在windows使用相同的程序,子线程的cpu使用率基本和主线程一致。
Linux下编译的时候:g++ -fopenmp -o outfile [srcfile]
程序中包含了<omp.h>
windows下使用的是VS2008,使用的也是默认设置。
请问这是为什么啊?






walk121 2010-01-25
  • 打赏
  • 举报
回复
假设程序中有若干个线程以流水线的方式完成一个任务,想在每个线程里利用openMp
有个疑问,
如果机器是8核的话,由于线程之间协作的繁忙程度不一样,线程里的openmp设为几个并行处理比较好?
openMP在每个线程里会根据当前总体的运行情况(cpu繁忙程度)进行动态的调整并行任务个数还是会固定的采取8个核?
如果采取固定8个核会不会影响效率?
JiaoYanChen 2009-12-18
  • 打赏
  • 举报
回复
好贴,LZ有心人啊,先回了再细看
旗戈 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 goldencode 的回复:]
不错, OpenMP使用上比Native API方便多了,只要在你需要并行的地方加个编译器语句指明关键的变量的属性,编译器就负责帮你创建多线程了.

[/Quote]

相当经典简洁的总结啊:一是加上语句,二是指名关键变量属性。
剩下的就交给编译器来负责了~~
miaoshasha 2009-10-08
  • 打赏
  • 举报
回复
学习了,非常感谢
如果能看到你是怎样用openmp解决一个复杂的算法就好了
goldensea001 2009-06-24
  • 打赏
  • 举报
回复
学习了,收获颇丰,非常感谢楼主.
beyond_jhf 2009-05-26
  • 打赏
  • 举报
回复
辛苦了,intel_jeff大哥。。向你致敬!!!
好好学习OpenMP!!!
intel_jeff 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 qgdbr08 的回复:]
谢谢~ 辛苦了..
为什么 前边好多例子我都看不见了,只显示 CSDN图样..
为什么我再 VS2005环境中,用Intel编译器编译,会出现找不到libguide40.dll的错误提示呢??
[/Quote]

你是说在运行的时候找不到这个DLL吧?这个DLL在Intel编译器安装目录里面,你在运行环境中把这个DLL路径加到PATH里就可以了。
intel_jeff 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 76 楼 seavon 的回复:]
引用 33 楼 intel_jeff 的回复:
================================================
OpenMP中工作量的划分与调度
================================================
......
如上图所示,工作量的划分与调度有3种方式:
1、静态:把循环的迭代按照每x次(x=chunk)迭代分为一块,这样你的总工作量就被划分成了n/x块(n为迭代次数、循环次数),然后将这些块按照轮转法依次分配给各个线程。举个例子:比如我们有…
[/Quote]

这个是跟OpenMP实现相关了,Intel编译器的实现是尊重T的值,因为在通常情况下,T=核的数量。有核不用岂不浪费?
在你给的这个例子中,你有一个假设:每块工作量(i循环每次迭代的工作量)都是差不多的,所以8个线程与5个线程最后的运行时间都是差不多的。但是如果每块工作量不均匀的话,8个线程很可能就会比5个线程的时候快了。
加载更多回复(80)

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧