Проблема здесь в том, что вы просто копируете фрагмент массива - здесь нет ничего реально ограниченного ЦП, с которым разделение между ядрами значительно поможет.В конечном счете, эта проблема связана с памятью, копируя данные из одного фрагмента памяти в другой, и увеличение количества работающих одновременно процессоров, вероятно, только увеличивает конкуренцию.
Сказав это, я могу стать маленьким (~ 10%)ускорения, если я немного переделываю цикл, чтобы получить оператор if из цикла.Это:
CALL tick(clock)
!$OMP PARALLEL PRIVATE(j,x,y,xnew, ynew) SHARED(ex, ey, f, fplus) DEFAULT(none)
!$OMP DO
DO j = 1, 8
DO y=1+ey(j), yDim
DO x=1+ex(j), xDim
f(x,y,j)=fplus(x-ex(j),y-ey(j),j)
END DO
END DO
END DO
!$OMP END DO
!$OMP END PARALLEL
time2 = tock(clock)
или это:
CALL tick(clock)
!$OMP PARALLEL PRIVATE(j,x,y,xnew, ynew) SHARED(ex, ey, f, fplus) DEFAULT(none)
!$OMP DO
DO j = 1, 8
f(1+ex(j):xDim, 1+ey(j):yDim, j) = fplus(1:xDim-ex(j),1:yDim-ey(j),j)
ENDDO
!$OMP END DO
!$OMP END PARALLEL
time3 = tock(clock)
сделать очень скромные улучшения.Если бы fplus был функцией аргументов x, y и j и требовал значительных вычислительных ресурсов, все было бы иначе;но копия памяти вряд ли сильно ускорится.