【问题标题】:Trouble about nested loop and openmp in fortran关于fortran中嵌套循环和openmp的问题
【发布时间】:2015-08-21 11:56:24
【问题描述】:

我无法将 openmp 应用于 Fortran 中的嵌套循环,如下所示:

!$omp parallel do default(none) private(irow,mm,iparm,jrow) shared(nsrow,nparm,zvec,bvec,brx,zdense) 
    do irow = 2, nsrow 
               mm = irow -1
               do iparm = 1, nparm
                  do jrow = 1, mm
                     zvec(jrow) = zdense( ijdense(jrow,irow,nsrow) )
                  end do
                  bvec(iparm) = ddot( mm, zvec, 1, brx(:,iparm), 1)
               end do
               brx(irow,:) = (brx(irow,:)-bvec)/zdense(ijdense(irow,irow,nsrow)) 
     end do
 !$omp end parallel do

当我将串行与 openmp 版本进行比较时,最后一个给出了奇怪的结果。你知道为什么或者可以指出一个关于嵌套循环和openmp的好教程吗?提前谢谢你

【问题讨论】:

  • 以下任何答案是否有助于解决您的问题?如果它有帮助,请接受它以帮助有类似问题的人。如果没有帮助,请告诉我,以便我删除它,以免人们浪费时间查看它。

标签: fortran openmp


【解决方案1】:

显式并行化的循环是外循环(irow 循环)。这种并行化使得每个线程可以有一组不相交的索引irow。当涉及到其他索引时,iparmjrow,每个线程在某些时候都会得到jrow = 1,这意味着所有线程集zvec(1),并且由于zvec 是共享的,你肯定会得到一个奇怪的结果.因为您永远不会知道zvec(1) 中的内容。 iparmbrx 也是如此。因此,正如 Gilles 所建议的,zvec 必须是私有的,您才能获得与顺序运行相同的结果。

当我看到iparm 循环时,最好并行化iparm 循环并保持brx 共享。或者在brx 上有减少条款,但这仍然很棘手。

    do irow = 2, nsrow 
        mm = irow -1
        !$omp parallel do default(none) private(irow,mm,iparm,jrow,zvec) shared(nsrow,nparm,bvec,brx,zdense) 
        do iparm = 1, nparm
            do jrow = 1, mm
                zvec(jrow) = zdense( ijdense(jrow,irow,nsrow) )
            end do
            bvec(iparm) = ddot( mm, zvec, 1, brx(:,iparm), 1)
        end do
        !$omp end parallel do
        brx(irow,:) = (brx(irow,:)-bvec)/zdense(ijdense(irow,irow,nsrow)) 
    end do

【讨论】:

    【解决方案2】:

    我在这里看到的第一件事是zvec 是共享的,而它应该是私有的。我猜bvec 也有同样的故事。先试试,然后告诉我们。

    【讨论】:

    • 感谢您的回复,但它不起作用。是依赖的问题吗?
    • 好吧,我没有看到你确实也依赖于brx:你需要它的所有irow 值来计算bvec,然后你使用@987654327 更新brx @。因此,如果您并行更新brx,您将更改操作的顺序,从而更改bvec 的评估。这行不通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多