基本上我想要做的是收集flg
的数组,其坐标(rlon_mband
,rlat_mband
)在特定半径(radii
)内并保存为一个新数组inflg
。
正如您可以从一个线程结果中注意到新数组中索引的顺序' inflg'是单调增加(im=1,2,3...
),而如果我使用多个线程,则数组索引的顺序只是随机变化。
我认为它可以在每个线程中初始化im1
。但是,如果您将im1
设为shared
或reduction
,那么新数组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
答案 0 :(得分:0)
您可以使用critical
序列化部分循环。它会对性能产生负面影响。另外,我不知道你是否还需要ordered
。 Atomic
也可以在这里使用,性能更好,但我现在看不到一种直截了当的方式,也许是其他人。
!$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
如果im1
为private
,则将在每个帖子中具有不同的值。此外,默认情况下,此值将在开始时未定义。
使用reduction
时,缩小变量在循环内部未定义 - &gt;这里不可能使用它。