并行化嵌套do循环Fortran

时间:2016-11-30 10:03:29

标签: parallel-processing fortran openmp

当我尝试在子程序中执行以下操作时,我没有获得任何加速:

!$ call omp_set_num_threads(threadno)
call system_clock(x1)

!$OMP PARALLEL do private(i), reduction(+:total)    
    do i = 1,m
        total = 0.d0
        call result(a,l,b,qm,q,en) !here l is input for subroutine and en is output
        qm(:,i) = q
        qtv(i) = qt
        mean = sum(q)/size(q)
        do i2 = 1,k
            total = total + ((mean-q(i2))**2)/(a+b)
        end do
        qvv(i1) = total
    end do
    call system_clock(x2)
    print *, x2-x1
!$OMP END PARALLEL do

1 个答案:

答案 0 :(得分:0)

关于OpenMP部分的评论:

  1. total不应在循环中重置,而应在!$OMP子句之前重置。
  2. i2mean应该是私密的。
  3. 如果q在循环的迭代之间没有变化,sum(q)/size(q)应放在外面。
  4. 缺乏私密设置可能导致内存访问冲突(从而导致速度减慢)。

    我猜您显示的代码接近但不是您编译的代码。使用已编译的代码来提供更好的帮助会很有用。

    干杯,

    皮尔

    编辑:对于OpenMP代码的计时,您应该使用omp_get_wtime(请参阅https://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html)来提供临时https://en.wikipedia.org/wiki/Wall-clock_time。 openmp例程的模块加载了use omp_lib