我对三个参数有三个Do循环,我想使用openmp来加快计算速度,以找到作为A的函数的F的最大值,并最终绘制F_max vsA。这是我的尝试,仅使用多核在开始时,然后下降到一个。如果我忽略了关键的陈述,它不会产生正确的最大值。我该如何使其正常工作?任何帮助将不胜感激。
PROGRAM maxfunction
Do i=0, n1
A= i*1.0
Max=0
Do j=0, n2
B=j*1.0
Do k=0,n3
C=k*1.0
F=findF(A,B,C)
If( F > Max) Then
Max= F
endif
Enddo
Enddo
Enddo
ENDPROGRAM
FUNCTION findF(a,b,c)
findF= g1(a,b,c) + g2(a,b,c) +g3(a,b,c)
!returns value of findF
ENDFUNCTION findF
function g1(a,b,c)
!do stuff with a,b,c
!returns value g1
endfunction g1
function g2(a,b,c)
!do stuff with a,b,c
!returns value g2
endfunction g2
function g3(a,b,c)
!do stuff with a,b,c
!returns value g3
endfunction g3
代码具有这种最小的结构。
答案 0 :(得分:0)
您可以尝试改编以下代码。希望能帮助到你。关键功能是减少OMP,请随时阅读该主题。 https://computing.llnl.gov/tutorials/openMP/
PROGRAM maxfunction
double precision Maximum
n1 = 10
n2 = 20
n3 = 30
Maximum = -1000000.0
c$OMP PARALLEL DO DEFAULT(SHARED)
c$OMP+ SHARED(n1, n2, n3)
c$OMP+ PRIVATE(i,j, A, B, C, F)
c$OMP+ reduction(max: Maximum)
Do i=0, n1
A= i*1.0
Do j=0, n2
B=j*1.0
Do k=0,n3
C=k*1.0
F=findF(A,B,C)
If( F > Maximum) Then
Maximum= F
endif
Enddo
Enddo
Enddo
c$OMP END PARALLEL DO
print *, Maximum
ENDPROGRAM
与
function g1(a,b,c)
g1 = a
endfunction g1
function g2(a,b,c)
g2 = b
endfunction g2
function g3(a,b,c)
g3 = -c
endfunction g3
无论线程数量多少,此代码都会返回30.0