减少数组索引并使用Fortran中的openmp更新数组

时间:2014-04-25 15:59:49

标签: fortran openmp

基本上我想要做的是收集flg的数组,其坐标(rlon_mbandrlat_mband)在特定半径(radii)内并保存为一个新数组inflg

正如您可以从一个线程结果中注意到新数组中索引的顺序' inflg'是单调增加(im=1,2,3...),而如果我使用多个线程,则数组索引的顺序只是随机变化。

我认为它可以在每个线程中初始化im1。但是,如果您将im1设为sharedreduction,那么新数组inflg的索引顺序将会很糟糕......

program test
implicit none
integer,parameter :: iscan=50,ifov=20
real,   parameter :: radii=6.0
integer :: im1, m,n
real :: temp,rLonMax,rLonmin,rLatMin,rLatMax
real :: rLon_Mband(ifov, iscan),rLat_Mband(ifov, iscan)
real :: flg(ifov, iscan)
real :: inflg(1000)


do m=1,iscan
do n=1,ifov
    rLon_Mband(n,m)=0.5+0.01*m+0.1*n
enddo
enddo

do m=1,iscan
do n=1,ifov
    rLat_Mband(n,m)=-10.0+0.1*m+0.01*n
enddo
enddo

print*,'rLon_Mband=', rLon_Mband(1:10,1),maxval(rLon_Mband(:,1))
print*,'rLat_Mband', rLat_Mband(1:10,1),maxval(rLat_mband(1,:))

do m=1,iscan
do n=1,ifov
    flg(n,m)=100*sin(real(m/iscan))+100*cos(real(n/ifov))
enddo
enddo

rLonMax=10.0
rLonmin=0.001
rLatMin=-10.0
rLatMax=10.0


iM1=1; temp=9999.0
!$omp parallel do default(none) &
!$omp private(m,n,temp,im1)&
!$omp shared(rLonMax,rLonmin,rLatMax,rLatmin)&
!$omp shared(flg,inflg,rlon_mband,rlat_mband)
do m=1,iScan
do n=1,iFov
!print*,'lon=', rLon_Mband(n,m)
!print*,'lat=', rLat_Mband(n,m)
  if ((rLon_Mband(n,m)<=rLonMax) .and.  &
     (rLon_Mband(n,m)>=rLonMin) .and. &
     (rLat_Mband(n,m)<=rLatMax).and.  &
     (rLat_Mband(n,m)>=rLatMin)) then
     temp=sqrt(rLon_Mband(n,m)**2+rLat_mband(n,m)**2)
     !print*,'temp', temp
     if (temp<=radii) then  ! 
        inflg(iM1)    = flg(n,m)
        print*,'im1,t=',iM1,flg(n,m), n,m
        iM1 = iM1+1
     end if
  end if
end do
end do  ! end_do
!$omp end parallel do


end program test

当我只使用一个线程时,我得到了这样的结果:

rLon_Mband=  0.610000014      0.709999979      0.810000002      0.909999967       1.00999999       1.11000001       1.21000004       1.30999994       1.41000009       1.50999999       2.50999999    
 rLat_Mband  -9.88999939      -9.87999916      -9.86999989      -9.85999966      -9.84999943      -9.83999920      -9.82999992      -9.81999969      -9.80999947      -9.79999924      -4.98999977    
 im1,t=           0   100.000000               1          41
 im1,t=           1   100.000000               2          41
 im1,t=           2   100.000000               3          41
 im1,t=           3   100.000000               1          42
 im1,t=           4   100.000000               2          42
 im1,t=           5   100.000000               3          42
 im1,t=           6   100.000000               4          42
 im1,t=           7   100.000000               5          42
 im1,t=           8   100.000000               6          42
 im1,t=           9   100.000000               7          42
 im1,t=          10   100.000000               8          42
 im1,t=          11   100.000000               9          42
 im1,t=          12   100.000000               1          43
 im1,t=          13   100.000000               2          43
 im1,t=          14   100.000000               3          43
 im1,t=          15   100.000000               4          43
 im1,t=          16   100.000000               5          43
 im1,t=          17   100.000000               6          43
 im1,t=          18   100.000000               7          43
 im1,t=          19   100.000000               8          43
 im1,t=          20   100.000000               9          43
 im1,t=          21   100.000000              10          43
 im1,t=          22   100.000000              11          43
 im1,t=          23   100.000000              12          43
 im1,t=          24   100.000000              13          43
 im1,t=          25   100.000000               1          44
 im1,t=          26   100.000000               2          44
 im1,t=          27   100.000000               3          44
 im1,t=          28   100.000000               4          44
 im1,t=          29   100.000000               5          44
 im1,t=          30   100.000000               6          44
 im1,t=          31   100.000000               7          44
 im1,t=          32   100.000000               8          44
 im1,t=          33   100.000000               9          44
 im1,t=          34   100.000000              10          44
 im1,t=          35   100.000000              11          44
 im1,t=          36   100.000000              12          44
 im1,t=          37   100.000000              13          44
 im1,t=          38   100.000000              14          44
 im1,t=          39   100.000000              15          44
 im1,t=          40   100.000000               1          45
 im1,t=          41   100.000000               2          45
 im1,t=          42   100.000000               3          45
 im1,t=          43   100.000000               4          45
 im1,t=          44   100.000000               5          45
 im1,t=          45   100.000000               6          45
 im1,t=          46   100.000000               7          45
 im1,t=          47   100.000000               8          45
 im1,t=          48   100.000000               9          45
 im1,t=          49   100.000000              10          45
 im1,t=          50   100.000000              11          45
 im1,t=          51   100.000000              12          45
 im1,t=          52   100.000000              13          45
 im1,t=          53   100.000000              14          45
 im1,t=          54   100.000000              15          45
 im1,t=          55   100.000000              16          45
 im1,t=          56   100.000000              17          45
 im1,t=          57   100.000000              18          45
 im1,t=          58   100.000000               1          46
 im1,t=          59   100.000000               2          46
 im1,t=          60   100.000000               3          46
 im1,t=          61   100.000000               4          46
 im1,t=          62   100.000000               5          46
 im1,t=          63   100.000000               6          46
 im1,t=          64   100.000000               7          46
 im1,t=          65   100.000000               8          46
 im1,t=          66   100.000000               9          46
 im1,t=          67   100.000000              10          46
 im1,t=          68   100.000000              11          46
 im1,t=          69   100.000000              12          46
 im1,t=          70   100.000000              13          46
 im1,t=          71   100.000000              14          46
 im1,t=          72   100.000000              15          46
 im1,t=          73   100.000000              16          46
 im1,t=          74   100.000000              17          46
 im1,t=          75   100.000000              18          46
 im1,t=          76   100.000000              19          46
 im1,t=          77   54.0302277              20          46
 im1,t=          78   100.000000               1          47
 im1,t=          79   100.000000               2          47
 im1,t=          80   100.000000               3          47
 im1,t=          81   100.000000               4          47
 im1,t=          82   100.000000               5          47
 im1,t=          83   100.000000               6          47
 im1,t=          84   100.000000               7          47
 im1,t=          85   100.000000               8          47
 im1,t=          86   100.000000               9          47
 im1,t=          87   100.000000              10          47
 im1,t=          88   100.000000              11          47
 im1,t=          89   100.000000              12          47
 im1,t=          90   100.000000              13          47
 im1,t=          91   100.000000              14          47
 im1,t=          92   100.000000              15          47
 im1,t=          93   100.000000              16          47
 im1,t=          94   100.000000              17          47
 im1,t=          95   100.000000              18          47
 im1,t=          96   100.000000              19          47
 im1,t=          97   54.0302277              20          47
 im1,t=          98   100.000000               1          48
 im1,t=          99   100.000000               2          48
 im1,t=         100   100.000000               3          48
 im1,t=         101   100.000000               4          48
 im1,t=         102   100.000000               5          48
 im1,t=         103   100.000000               6          48
 im1,t=         104   100.000000               7          48
 im1,t=         105   100.000000               8          48
 im1,t=         106   100.000000               9          48
 im1,t=         107   100.000000              10          48
 im1,t=         108   100.000000              11          48
 im1,t=         109   100.000000              12          48
 im1,t=         110   100.000000              13          48
 im1,t=         111   100.000000              14          48
 im1,t=         112   100.000000              15          48
 im1,t=         113   100.000000              16          48
 im1,t=         114   100.000000              17          48
 im1,t=         115   100.000000              18          48
 im1,t=         116   100.000000              19          48
 im1,t=         117   54.0302277              20          48
 im1,t=         118   100.000000               1          49
 im1,t=         119   100.000000               2          49
 im1,t=         120   100.000000               3          49
 im1,t=         121   100.000000               4          49
 im1,t=         122   100.000000               5          49
 im1,t=         123   100.000000               6          49
 im1,t=         124   100.000000               7          49
 im1,t=         125   100.000000               8          49
 im1,t=         126   100.000000               9          49
 im1,t=         127   100.000000              10          49
 im1,t=         128   100.000000              11          49
 im1,t=         129   100.000000              12          49
 im1,t=         130   100.000000              13          49
 im1,t=         131   100.000000              14          49
 im1,t=         132   100.000000              15          49
 im1,t=         133   100.000000              16          49
 im1,t=         134   100.000000              17          49
 im1,t=         135   100.000000              18          49
 im1,t=         136   100.000000              19          49
 im1,t=         137   54.0302277              20          49
 im1,t=         138   184.147095               1          50
 im1,t=         139   184.147095               2          50
 im1,t=         140   184.147095               3          50
 im1,t=         141   184.147095               4          50
 im1,t=         142   184.147095               5          50
 im1,t=         143   184.147095               6          50
 im1,t=         144   184.147095               7          50
 im1,t=         145   184.147095               8          50
 im1,t=         146   184.147095               9          50
 im1,t=         147   184.147095              10          50
 im1,t=         148   184.147095              11          50
 im1,t=         149   184.147095              12          50
 im1,t=         150   184.147095              13          50
 im1,t=         151   184.147095              14          50
 im1,t=         152   184.147095              15          50
 im1,t=         153   184.147095              16          50
 im1,t=         154   184.147095              17          50
 im1,t=         155   184.147095              18          50
 im1,t=         156   184.147095              19          50
 im1,t=         157   138.177322              20          50

然而,当我执行程序时

 export OMP_NUM_THREADS=2

我得到了这个输出:

rLon_Mband=  0.610000014      0.709999979      0.810000002      0.909999967       1.00999999       1.11000001       1.21000004       1.30999994       1.41000009       1.50999999       2.50999999    
 rLat_Mband  -9.88999939      -9.87999916      -9.86999989      -9.85999966      -9.84999943      -9.83999920      -9.82999992      -9.81999969      -9.80999947      -9.79999924      -4.98999977    
 im1,t=         512   100.000000               1          41
 im1,t=         513   100.000000               2          41
 im1,t=         514   100.000000               3          41
 im1,t=         515   100.000000               1          42
 im1,t=         516   100.000000               2          42
 im1,t=         517   100.000000               3          42
 im1,t=         518   100.000000               4          42
 im1,t=         519   100.000000               5          42
 im1,t=         520   100.000000               6          42
 im1,t=         521   100.000000               7          42
 im1,t=         522   100.000000               8          42
 im1,t=         523   100.000000               9          42
 im1,t=         524   100.000000               1          43
 im1,t=         525   100.000000               2          43
 im1,t=         526   100.000000               3          43
 im1,t=         527   100.000000               4          43
 im1,t=         528   100.000000               5          43
 im1,t=         529   100.000000               6          43
 im1,t=         530   100.000000               7          43
 im1,t=         531   100.000000               8          43
 im1,t=         532   100.000000               9          43
 im1,t=         533   100.000000              10          43
 im1,t=         534   100.000000              11          43
 im1,t=         535   100.000000              12          43
 im1,t=         536   100.000000              13          43
 im1,t=         537   100.000000               1          44
 im1,t=         538   100.000000               2          44
 im1,t=         539   100.000000               3          44
 im1,t=         540   100.000000               4          44
 im1,t=         541   100.000000               5          44
 im1,t=         542   100.000000               6          44
 im1,t=         543   100.000000               7          44
 im1,t=         544   100.000000               8          44
 im1,t=         545   100.000000               9          44
 im1,t=         546   100.000000              10          44
 im1,t=         547   100.000000              11          44
 im1,t=         548   100.000000              12          44
 im1,t=         549   100.000000              13          44
 im1,t=         550   100.000000              14          44
 im1,t=         551   100.000000              15          44
 im1,t=         552   100.000000               1          45
 im1,t=         553   100.000000               2          45
 im1,t=         554   100.000000               3          45
 im1,t=         555   100.000000               4          45
 im1,t=         556   100.000000               5          45
 im1,t=         557   100.000000               6          45
 im1,t=         558   100.000000               7          45
 im1,t=         559   100.000000               8          45
 im1,t=         560   100.000000               9          45
 im1,t=         561   100.000000              10          45
 im1,t=         562   100.000000              11          45
 im1,t=         563   100.000000              12          45
 im1,t=         564   100.000000              13          45
 im1,t=         565   100.000000              14          45
 im1,t=         566   100.000000              15          45
 im1,t=         567   100.000000              16          45
 im1,t=         568   100.000000              17          45
 im1,t=         569   100.000000              18          45
 im1,t=         570   100.000000               1          46
 im1,t=         571   100.000000               2          46
 im1,t=         572   100.000000               3          46
 im1,t=         573   100.000000               4          46
 im1,t=         574   100.000000               5          46
 im1,t=         575   100.000000               6          46
 im1,t=         576   100.000000               7          46
 im1,t=         577   100.000000               8          46
 im1,t=         578   100.000000               9          46
 im1,t=         579   100.000000              10          46
 im1,t=         580   100.000000              11          46
 im1,t=         581   100.000000              12          46
 im1,t=         582   100.000000              13          46
 im1,t=         583   100.000000              14          46
 im1,t=         584   100.000000              15          46
 im1,t=         585   100.000000              16          46
 im1,t=         586   100.000000              17          46
 im1,t=         587   100.000000              18          46
 im1,t=         588   100.000000              19          46
 im1,t=         589   54.0302277              20          46
 im1,t=         590   100.000000               1          47
 im1,t=         591   100.000000               2          47
 im1,t=         592   100.000000               3          47
 im1,t=         593   100.000000               4          47
 im1,t=         594   100.000000               5          47
 im1,t=         595   100.000000               6          47
 im1,t=         596   100.000000               7          47
 im1,t=         597   100.000000               8          47
 im1,t=         598   100.000000               9          47
 im1,t=         599   100.000000              10          47
 im1,t=         600   100.000000              11          47
 im1,t=         601   100.000000              12          47
 im1,t=         602   100.000000              13          47
 im1,t=         603   100.000000              14          47
 im1,t=         604   100.000000              15          47
 im1,t=         605   100.000000              16          47
 im1,t=         606   100.000000              17          47
 im1,t=         607   100.000000              18          47
 im1,t=         608   100.000000              19          47
 im1,t=         609   54.0302277              20          47
 im1,t=         610   100.000000               1          48
 im1,t=         611   100.000000               2          48
 im1,t=         612   100.000000               3          48
 im1,t=         613   100.000000               4          48
 im1,t=         614   100.000000               5          48
 im1,t=         615   100.000000               6          48
 im1,t=         616   100.000000               7          48
 im1,t=         617   100.000000               8          48
 im1,t=         618   100.000000               9          48
 im1,t=         619   100.000000              10          48
 im1,t=         620   100.000000              11          48
 im1,t=         621   100.000000              12          48
 im1,t=         622   100.000000              13          48
 im1,t=         623   100.000000              14          48
 im1,t=         624   100.000000              15          48
 im1,t=         625   100.000000              16          48
 im1,t=         626   100.000000              17          48
 im1,t=         627   100.000000              18          48
 im1,t=         628   100.000000              19          48
 im1,t=         629   54.0302277              20          48
 im1,t=         630   100.000000               1          49
 im1,t=         631   100.000000               2          49
 im1,t=         632   100.000000               3          49
 im1,t=         633   100.000000               4          49
 im1,t=         634   100.000000               5          49
 im1,t=         635   100.000000               6          49
 im1,t=         636   100.000000               7          49
 im1,t=         637   100.000000               8          49
 im1,t=         638   100.000000               9          49
 im1,t=         639   100.000000              10          49
 im1,t=         640   100.000000              11          49
 im1,t=         641   100.000000              12          49
 im1,t=         642   100.000000              13          49
 im1,t=         643   100.000000              14          49
 im1,t=         644   100.000000              15          49
 im1,t=         645   100.000000              16          49
 im1,t=         646   100.000000              17          49
 im1,t=         647   100.000000              18          49
 im1,t=         648   100.000000              19          49
 im1,t=         649   54.0302277              20          49
 im1,t=         650   184.147095               1          50
 im1,t=         651   184.147095               2          50
 im1,t=         652   184.147095               3          50
 im1,t=         653   184.147095               4          50
 im1,t=         654   184.147095               5          50
 im1,t=         655   184.147095               6          50
 im1,t=         656   184.147095               7          50
 im1,t=         657   184.147095               8          50
 im1,t=         658   184.147095               9          50
 im1,t=         659   184.147095              10          50
 im1,t=         660   184.147095              11          50
 im1,t=         661   184.147095              12          50
 im1,t=         662   184.147095              13          50
 im1,t=         663   184.147095              14          50
 im1,t=         664   184.147095              15          50
 im1,t=         665   184.147095              16          50
 im1,t=         666   184.147095              17          50
 im1,t=         667   184.147095              18          50
 im1,t=         668   184.147095              19          50
 im1,t=         669   138.177322              20          50

另外我的执行shell是这样的:

#!/bin/bash

gfortran -fopenmp test.f90 -o test.exe
export export OMP_NUM_THREADS=2
test.exe

1 个答案:

答案 0 :(得分:0)

您可以使用critical序列化部分循环。它会对性能产生负面影响。另外,我不知道你是否还需要orderedAtomic也可以在这里使用,性能更好,但我现在看不到一种直截了当的方式,也许是其他人。

!$omp parallel do default(none) &
!$omp private(m,n,temp)&
!$omp shared(rLonMax,rLonmin,rLatMax,rLatmin)&
!$omp shared(flg,inflg,rlon_mband,rlat_mband,im1)&
do m=1,iScan
 do n=1,iFov
  if ((rLon_Mband(n,m)<=rLonMax) .and.  &
     (rLon_Mband(n,m)>=rLonMin) .and. &
     (rLat_Mband(n,m)<=rLatMax).and.  &
     (rLat_Mband(n,m)>=rLatMin)) then

     temp=sqrt(rLon_Mband(n,m)**2+rLat_mband(n,m)**2)

     if (temp<=radii) then  
        !$omp critical
        inflg(iM1)    = flg(n,m)
        print*,'im1,t=',iM1,flg(n,m), n,m
        iM1 = iM1+1
        !$omp end critical
     end if
  end if
 end do
end do
!$omp end parallel do

如果im1private,则在每个帖子中具有不同的值。此外,默认情况下,此值将在开始时未定义。

使用reduction时,缩小变量在循环内部未定义 - &gt;这里不可能使用它。