关于intel 和 vs 两个编译器,对OpenMp的效率

youxia000 2008-08-22 09:58:00
如果我只是要使用openmp ,哪么采用这两种编译器生成的程序,在效率上有什么差别么,那个更好些?比较vs 08 sp1 和 intel 的10.1.022

另外intel的编译器除了根据cpu对编译做了优化,还有其他的方面优化么,是否还支持其他的功能

还有个 intel 推的 thread block 和omp 可以同时用么他们是什么关系

对thread block不是很了解
...全文
886 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
intel_iclifort 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 youxia000 的回复:]
用了几天感觉,intel的编译是要慢一点,不过在同使用omp的情况下还是intel的好,如果没有用omp,intel的好的就更明显了
我想可能是 向量化的好处吧,在问问 如果单核上 向量化还能有这么明显么,他是否也利用了多核来做单线程的程序
[/Quote]

我前面提到过,向量化是CPU指令级别的优化,只要使用的处理器(核)支持相应的SIMD指令,就会有非常好的效果的。这种类型的优化,和你的系统中有几个核,几个处理器无关的。

而OpenMP可以看成是线程级别的优化,即你原先的代码可能是串行的(或者单线程的),通过很少的改动,不用考虑线程创建维护的细节,就被编译器自动生成多个线程并发执行了。这样运行在多处理器(核)的系统上,性能就会对应的提升(当然不是线性的),在单核上运行也完全没有问题。

各种优化功能组合起来使用,不一定是 1+1>2。可能需要通过多次试验,找到最适合你应用的那几个。

youxia000 2008-09-03
  • 打赏
  • 举报
回复
哦,虽然不是一个层上的优化

但还是都要最终的影响性能的,
ollydbg23 2008-08-30
  • 打赏
  • 举报
回复
呵呵,这个我也很有兴趣想了解一下,大侠们讲解一下。。。
youxia000 2008-08-29
  • 打赏
  • 举报
回复
多谢,找到了chm的文档和 例子了

之前都没注意,呵呵

用了几天感觉,intel的编译是要慢一点,不过在同使用omp的情况下还是intel的好,如果没有用omp,intel的好的就更明显了
我想可能是 向量化的好处吧,在问问 如果单核上 向量化还能有这么明显么,他是否也利用了多核来做单线程的程序

ps:intel公司不限制上网么,你们是领导要求的来回答问题,还是个人行为,4个三角要多少分啊
intel_iclifort 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 speme 的回复:]
不过,用intel的编译器会不在AMD的机子上运行比较慢?
[/Quote]

您试过拿相同的代码,用不同厂家的最新版本编译器(Microsoft,Intel,PGI...),在AMD的机子上生成可执行程序,谁的性能最好吗?

好像还是用Intel的编译器更快些,呵呵。 前提是你要用对,用好编译器的优化选项

intel_iclifort 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 youxia000 的回复:]
而使用omp后,他们的相差不是很大了包含上随机的误差,他俩在我的测试例子上大概10%的相差,没明显看出那个更好,不过你说不用考虑他们之间的选择那就好了,起码选择时候省事了,我想统一后的还是能包含向量化这个技术吧
[/Quote]

向量化是针对指令级的优化,而OpenMP是线程级的优化,两者可以同时进行

要注意到,线程本身的创建和维护也是有开销的,还可能引入负载不均衡等性能问题,这些可能会部分抵消其它的优化效果

speme 2008-08-28
  • 打赏
  • 举报
回复
不过,用intel的编译器会不在AMD的机子上运行比较慢?
intel_iclifort 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ollydbg23 的回复:]
我怀疑您是否就是intel公司的员工,主要负责在csdn答疑解惑?
[/Quote]

呵呵,看来我们的ID还不够明显。看看这里 http://subject.csdn.net/IntelMulti-core/,你就全明白了。

很高兴能在CSDN中的“英特尔多核软件开发”子论坛中,和大家一起交流和分享。

欢迎您也多多参与,发些帖子提问也好,回答更好。我们会不定期地举办“最有技术价值的发帖”的评选活动。
ollydbg23 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 intel_iclifort 的回复:]

补充说明一下,采用OpenMP的代码,也同样是与操作系统和硬件平台无关的。因为如何创建,维护和销毁线程的工作,完全是由编译器自动完成的. 这样就可以保证了代码的跨平台,可移植. 线程的数量, 缺省等于系统中的CPU或者核(Core)的总数
[/Quote]
谢谢,你回答的如此详细和热情。
我怀疑您是否就是intel公司的员工,主要负责在csdn答疑解惑?
intel_iclifort 2008-08-28
  • 打赏
  • 举报
回复

补充说明一下,采用OpenMP的代码,也同样是与操作系统和硬件平台无关的。因为如何创建,维护和销毁线程的工作,完全是由编译器自动完成的. 这样就可以保证了代码的跨平台,可移植. 线程的数量, 缺省等于系统中的CPU或者核(Core)的总数


intel_iclifort 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ollydbg23 的回复:]
在intel compiler 的CHM文档里面,对于编译器可以做何等优化,的确写得非常详细,楼主可以仔细看看,而且它还提供了测试的一些代码。
[/Quote]

是的,如果愿意读一读Intel编译器的联机文档,会发现其中提供了很多优化的方法和建议。 另外,在V10.0以后的版本,安装目录下还提供了很多sample code

另外,如果还知道如何生成和阅读Intel编译器的优化报告,然后对代码进行适当的改动,往往能使性能大幅提高

[Quote=引用 4 楼 ollydbg23 的回复:]
另外一个问题,我个人感觉,就是intel编译器的编译速度比较慢(我用的是9.1的编译器,环境是VC6)
[/Quote]

呵呵,你提到的不是一个新问题。 原因在于,Intel编译器采用了相当多的优化算法,编译时间会有所增加。从v8.x, v9.x 到目前的v10.x,一直都在努力做到提高性能的同时,尽量不增加编译时间,但难度很大。 另外一个是,生成的可执行程序的体积也会变大,好在目前看来硬盘空间不是成为很大的问题。

此外,当您的代码还在开发和调试的阶段,尚未成型,有些比较耗时的高级优化功能(如IPO,PGO等)并不建议使用。
ollydbg23 2008-08-28
  • 打赏
  • 举报
回复
回答的真不错,受益匪浅。
在intel compiler 的CHM文档里面,对于编译器可以做何等优化,的确写得非常详细,楼主可以仔细看看,而且它还提供了测试的一些代码。

另外一个问题,我个人感觉,就是intel编译器的编译速度比较慢(我用的是9.1的编译器,环境是VC6)
youxia000 2008-08-26
  • 打赏
  • 举报
回复
非常感谢如此详细的回答,测试了下,单线程就是不用omp的时候 intel 的远大于 MS的,这个就是你说的向量化了

而使用omp后,他们的相差不是很大了包含上随机的误差,他俩在我的测试例子上大概10%的相差,没明显看出那个更好,不过你说不用考虑他们之间的选择那就好了,起码选择时候省事了,我想统一后的还是能包含向量化这个技术吧

那个文章看了下,目前没有移植,跨平台需求,omp简单,够用,
intel_iclifort 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 youxia000 的帖子:]
如果我只是要使用openmp ,哪么采用这两种编译器生成的程序,在效率上有什么差别么,那个更好些?比较vs 08 sp1 和 intel 的10.1.022
[/Quote]

在Windows操作系统上,ICC很早以前的版本就已经支持OpenMP了,而VC++是从2005版本才开始的。性能上的差别,很容易自己比较得出。来回转换使用VC++的Project,或者Intel C++的Project,不受任何限制。命令行上就更简单了。 另外,可能在不远的将来,开发人员不需要考虑如何在两个 OpenMP RTL 之间选择了。原因暂时保密,请原谅。

[Quote=引用楼主 youxia000 的帖子:]
另外intel的编译器除了根据cpu对编译做了优化,还有其他的方面优化么,是否还支持其他的功能
[/Quote]
Intel编译器对特定CPU的优化,通常我们称作“向量化”,其实就是尽可能多得采用处理器支持的SIMD指令。其它方面的优化,其实联机帮助手册中,已经有很详细的说明,比如对循环的优化,IPO优化,PGO优化,等等。。。


[Quote=引用楼主 youxia000 的帖子:]
还有个 intel 推的 thread block 和omp 可以同时用么他们是什么关系

对thread block不是很了解
[/Quote]
论坛置顶的文章中,有Intel软件工具的技术文章,可以找到介绍TBB (Thread Building Block)的文章 http://topic.csdn.net/u/20080328/10/6ba0957d-3c5d-4fda-ae86-2b92c2a0e62f.html

简单的说,实现多线程化的方式,采用在程序代码中插入OpenMP原语(#pragma omp xxxx)的方式,是比较简单,渐进,同时和操作系统无关。所有的工作都是由编译器自动完成的。当然它对原有串行代码的改动量比较小,如果原来的算法支持数据并行,那么OpenMP比较合适

而TBB可以理解为提供了多线程化方法的C++类,它隐藏了不同操作系统之间thread实现的底层API和调用机制。多线程开发是通过调用TBB类的方法来实现,这样就能保证代码的跨平台,可移植性。

567

社区成员

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

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