回 帖 发 新 帖 刷新版面

主题:OpenMP并行后,比原来的程序慢了100倍,这是什么原因?

使用简单的程序做OpenMP测试,发现OpenMP并行后的程序比原来程序慢了100倍以上
    这个程序串行的时候在服务器上只需要运行7.45秒,而使用OpenMP并行之后时间用了10分钟
    我的服务器是一个8核的IBM刀片服务器,编译器是intel的ifort 10.1.018,原程序intel编译器给做了矢量优化LOOP WAS VECTORIZED,进行OpenMP并行后,同时进行了OpenMP优化和矢量优化(不知道有没有冲突)。
    使用的编译选项是
    ifort -openmp -pg -o a.out FirstTest.F90 (OpenMP优化的选项)
    ifort -pg -o a.out FirstTest.F90 (未优化的选项)
      具体程序如下:
        n=500000000
    area=0

    !$OMP PARALLEL PRIVATE(x,myid,nthreads,i,j)
      !$ myid = OMP_GET_THREAD_NUM()
      !$ nthreads = OMP_GET_NUM_THREADS();
    !$OMP DO
    do j=0,n
    do i=0,n
        x=i+j+0.5
        area = 4.0/(1.0+x*x*x*x)
    end do
    end do
    !$OMP END DO
    !$OMP END PARALLEL
    这是什么原因导致的呢?因为之前给程序做OpenMP并行效果不好,所以写了个程序对服务器做测试,得到了这个很奇怪的结果

回复列表 (共18个回复)

11 楼

嗯, 我omp是看一些英文资料的,不记得叫什么效应了. 不过这个过程其实还是好理解.
这个同步过程一般是cpu硬件实现的. 我觉得它不一定要把这个cache向内存回传,可以向下一级缓冲,例如L2或者L3作同步. 如果真要想内存同步,那代价不亚于数据竞争的系统干预了的损耗了.

12 楼

看来pfan又多了位活跃会员, 欢迎活跃!~

13 楼

那个看看CPU亲和力就差不多知道了,避免cache打架,一般在数据块之间放无用空间块(64字节)

14 楼

我对计算机硬件也不怎么了解,以前学的一点微机原理早忘光了。

大概理解的意思就是不同线程处理的数据在内存上的位置不能靠的太近,至少有一个Cache的距离。

我是菜鸟,最近在学OpenMP,还望各位前辈多多指教。

15 楼

[quote]嗯, 我omp是看一些英文资料的,不记得叫什么效应了. 不过这个过程其实还是好理解.
这个同步过程一般是cpu硬件实现的. [b]我觉得它不一定要把这个cache向内存回传[/b],可以向下一级缓冲,例如L2或者L3作同步. 如果真要想内存同步,那代价不亚于数据竞争的系统干预了的损耗了.[/quote]这个貌似可以通过BIOS设置是通写还是回写来控制。

16 楼

好像讲到多核并行的书都会提到一下这个cache的问题. 但是印象中一些omp的简单例程似乎是忽略这个问题.

bshine1225网友你的注册时间比我晚2天而已哦~ 只是你一直深潜吧. omp我也只是应用过部分,理解还不是很深刻,大家多谢讨论互相学习.

17 楼

其实如果咱不是做编译器或者通用库的话,多数情况下缓存问题不是咱最关心的问题。
只要我们充分利用FORTRAN语言提供的便于优化的东东,那剩下的问题完全就是编译器的活儿了:)

18 楼

OMP_GET_THREAD_NUM()
之前的东西去掉

我来回复

您尚未登录,请登录后再回复。点此登录或注册