Ich habe versucht, einen Code zu parallelisieren, aber es verschlechterte nur die Leistung. Ich schrieb einen Fortran-Code, der mehrere Monte-Carlo-Integrationen ausführt und dann ihren Mittelwert findet.Leistungsproblem während der Parallelisierung mit OpenMP
implicit none
integer, parameter :: n=100
integer, parameter :: m=1000000
real, parameter :: pi=3.141592654
real MC,integ,x,y
integer tid,OMP_GET_THREAD_NUM,i,j,init,inside
read*,init
call OMP_SET_NUM_THREADS(init)
call random_seed()
!$OMP PARALLEL DO PRIVATE(J,X,Y,INSIDE,MC)
!$OMP& REDUCTION(+:INTEG)
do i=1,n
inside=0
do j=1,m
call random_number(x)
call random_number(y)
x=x*pi
y=y*2.0
if(y.le.x*sin(x))then
inside=inside+1
endif
enddo
MC=inside*2*pi/m
integ=integ+MC/n
enddo
!$OMP END PARALLEL DO
print*, integ
end
Wie ich die Anzahl der Threads erhöhen, Laufzeit erhöht sich drastisch. Ich habe nach Lösungen für solche Probleme gesucht und in den meisten Fällen sind geteilte Speicherelemente das Problem, aber ich kann nicht sehen, wie es meinen Fall beeinflusst.
Ich verwende es auf einem 16-Core-Prozessor mit Intel Fortran-Compiler.
EDIT: Das Programm nach dem Hinzufügen implicit none
, alle Variablen deklarieren und das Hinzufügen der privaten Klausel
Willkommen. Bitte nimm die [Tour], sie wird allen Neulingen empfohlen. Wie hast du die Zeit gemessen? –
Bitte sehen Sie, wie ich die Einrückung in Ihrem Code geändert habe. Es ist gut, all Ihren Code eingerückt einzureichen, damit die Leute die Struktur sehen können. Es ist gut für Sie, Ihre Quelldateien auch so zu behalten. –
Was ist "innen"? Woher kommt das? Bitte stellen Sie sicher, dass Sie 'IMPLICIT NONE' verwenden. –