openmp Fortran --- код, показывающий ту же производительность - PullRequest
0 голосов
/ 25 мая 2018

Я новый пользователь openmp.Я написал следующий код на фортране и попытался добавить к нему параллельную функцию, используя openmp.К сожалению, это занимает то же время, что и серийная версия этой подпрограммы.Я компилирую его с помощью этой команды f2py.Я уверен, что мне не хватает ключевой концепции, но я не могу ее понять.Буду очень признателен за помощь в этом.

! F2py -c --opt = '- O3' --f90flags = '- fopenmp' -lgomp -m g3Test g3TestA.f90

exp1 =0.0
exp2 =0.0
exp3 =0.0

!$OMP PARALLEL DO shared(xConfig,s1,s2,s3,c1,c2,c3) private(h)&
!$OMP REDUCTION(+:exp1,exp2,exp3)   
do k=0,numRows-1
    xConfig(0:2) = X(k,0:2)
    do h=0,nPhi-1
        exp1(h) = exp1(h)+exp(-((xConfig(0)-c1(h))**2)*s1)
        exp2(h) = exp2(h)+exp(-((xConfig(1)-c2(h))**2)*s2)
        exp3(h) = exp3(h)+exp(-((xConfig(2)-c3(h))**2)*s3)
    end do
end do 
!$OMP END PARALLEL DO

ALine = exp1+exp2+exp3

1 Ответ

0 голосов
/ 25 мая 2018

Как четко объяснено в этом учебном учебном курсе по OpenMP Performance из Эдинбургского университета , например, существует ряд причин, по которым код OpenMP не обязательно масштабируется так, как вы ожидаете (например, сколькопоследовательная среда выполнения занимает часть, которую вы распараллеливаете, синхронизация между потоками, связь и другие параллельные издержки).

Вы можете легко протестировать производительность с различным числом потоков, вызвав ваш скрипт на python, например, с 2 потоками:

env OMP_NUM_THREADS=2 python <your script name>

, и вы можете рассмотреть возможность добавления следующих строк в своем примере кодачтобы получить визуальное подтверждение количества потоков, используемых в части OpenMP вашего кода:

do k=0,numRows-1
    !this if-statement is only for debugging, remove for timing
    !$ if (k==0) then
    !$     print *, 'num_threads running:', OMP_get_num_threads()
    !$ end if
    xConfig(0:2) = X(k,0:2)
...