回 帖 发 新 帖 刷新版面

主题:OPENMP 问题,高手请进(论坛处女贴)

奔腾双核的电脑,对一个DO循环 使用openmp后,运算时间只是提高了10%
相当的困惑不解,理论上应该是接近50%的呀 


 1 
  2         PROGRAM test_select_sort
  3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4 ! Purpose: To test the subroutine or function select_sort                       !
  5 ! Record of revisions:                                                          !
  6 !   Date       Programer           Description of changes                       !
  7 ! ==========  ==========      =================================                 !
  8 ! 2011.3.18     Joshua         Original                                         !   
  9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   
 10         !Data dictionary
 11         INTEGER,PARAMETER::N=180
 12         REAL,DIMENSION(N)::array=&
 13                 (/-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 14                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 15                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 16                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 17                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 18                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 19                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 20                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 21                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9 &
 22                 ,-10,1,2,34,5,5,678,345,90, 567,34,23,7,8,2,5,4,9/)
 23 
 24         REAL::time_start, time_end
 25         !
 26         INTERFACE
 27                 SUBROUTINE select_sort(array, n, c)
 28                 IMPLICIT NONE
 29                 INTEGER, INTENT(IN)::n
 30                 REAL, DIMENSION(n),INTENT(INOUT)::array
 31                 CHARACTER,INTENT(IN)::c
 32                 END SUBROUTINE select_sort
 33         END INTERFACE
 34 
 35         CALL CPU_TIME(time_start)
 36         !$OMP PARALLEL
 37         !$OMP DO
 38                    DO i=1,1000000
 39          !               WRITE(*,*) i
 40                         CALL select_sort(array,N, 'd')
                                                                                                   1,0-1         Top

回复列表 (共8个回复)

沙发


 24         REAL::time_start, time_end
 25         !
 26         INTERFACE
 27                 SUBROUTINE select_sort(array, n, c)
 28                 IMPLICIT NONE
 29                 INTEGER, INTENT(IN)::n
 30                 REAL, DIMENSION(n),INTENT(INOUT)::array
 31                 CHARACTER,INTENT(IN)::c
 32                 END SUBROUTINE select_sort
 33         END INTERFACE
 34 
 35         CALL CPU_TIME(time_start)
 36         !$OMP PARALLEL
 37         !$OMP DO
 38                    DO i=1,1000000
 39          !               WRITE(*,*) i
 40                         CALL select_sort(array,N, 'd')
 41                    END DO
 42         !$OMP END DO  
 43         !$OMP END PARALLEL        
 44         CALL CPU_TIME(time_end)
 45         WRITE(*,*) 'Elapsed time is',time_end-time_start, 'seconds'

板凳

影响并行性能很多原因的. 不过你的代码有个问题.
我看select_sort的interface里写的array是INTENT(INOUT). 也就是array会被作为函数的输出项.
但循环并行那里你并没有声明array是公有的还是私有的. 默认!$OMP DO只会把循环指标i作为私有变量其它公有, 那么array如果是公有那么两个线程就会同时对array进行读写操作, 这就是明显的数据竞争. 结果的正确性都难以保证. 而且有可能使得系统干预从而增加开销.

3 楼

楼主能否推荐一下fortran下的OpenMP编程的书籍?谢谢啦

4 楼


这位大侠能否推荐一下fortran下的OpenMP编程的书籍?我找到的都是C++的,先谢过了。[em2]

5 楼

可以看看《Parallel Programming in Fortran 95 using OpenMP》这本书。

6 楼


万分感谢!

7 楼


在哪里可以买到这本书?

8 楼

这些书没有引进, 基本只能够打印.
http://openmp.org/wp/
官方右方推荐的书值得看看. <Using OpenMP -- Portable Shared Memory Parallel Programming> 可以在网上找到电子书.

我来回复

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