【问题标题】:Nested loop in Fortran with OPENMP带有 OPENMP 的 Fortran 中的嵌套循环
【发布时间】:2014-11-10 13:30:54
【问题描述】:

我的(Fortran)代码非常简单。它所做的只是填充一个大数组,这取决于五个(独立的!)变量。这是一个简单的例子

 do i = 1, imax
   do j = 1, jmax
     do k = 1, kmax

    array(i,j,k) = ! some function of i,j,k

    end do
   end do
 end do

我会使用不同的线程以更快的方式填充数组的值。

我认为实现这一目标的最简单方法是将循环包含在这些命令中

!$OMP 并行执行

!$OMP 并行结束

但是,如果我这样做,我会得到与串行案例完全不同的结果。如果问题太简单,我深表歉意,但我真的找不到合适的例子来帮助解决我的问题。你能推荐一个解决方案或提供一个例子吗?

【问题讨论】:

  • 更具体地了解赋值语句的 rhs。发布一个最小的示例,展示您关注的不当行为。
  • 以及马克所说的,我必须问一下循环是否真的像你上面所说的那样有序?如果是这样的话,这对于 Fortran 来说是完全错误的,它就像你能得到的那样不友好的内存子系统,而且你几乎可以肯定从修复它得到的速度至少与使用 OpenMP 一样快
  • @IanBush:同意修复循环排序的必要性,但并不是说您至少可以加快速度,这在很大程度上取决于 RHS 的样子。

标签: loops fortran openmp


【解决方案1】:

我不知道发生了什么,但它可能是竞争条件或指令的错误声明。试试这个,看看它是否有效

!replace ... with variables that are constants as in shared(a,b,c)
!$omp parallel do default(private) shared(...) 
do i=1,imax
    j=1,jmax
        k=1,kmax
            array(i,j,k) = ! some function of i,j,k

        end do
     end do
 end do
 !$omp end parallel do

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多