为什么并行化的fortran代码运行时间更长?

时间:2017-08-15 13:01:52

标签: fortran openmp

我一直试图并行化我的2D FEM代码的子程序,它基本上在每个时间步执行矩阵乘法,以计算每个积分点的质量,内力和重力。我一直在尝试通过并行化来减少运行时间的许多选项,但是并行化代码总是需要比常规代码更长的时间。

有人可以告诉我为什么会发生这种情况吗?

谢谢

(附上你可以找到子程序)

subroutine Map2Nod()

!**********************************************************************
!    Function: Internal and External Forces, Mass at each nodes
!**********************************************************************
implicit none
integer :: I, IEl, Id, INod(4), ig, J

GrvF = 0.D0; InrF = 0.D0; ExtF = 0.D0; Mas = 0.D0

ExtF(2) = -50
ExtF(4) = -50


!$omp parallel do private(iel,ig,i,id,inod) 

do iel = 1, nel
    inod(:) = icon(:, iel)
    do ig = 1, 4
        do i = 1, 4
            id = (inod(i) - 1) * 2
            inrf(id + 1) = inrf(id + 1)+(sigg(1,ig,iel) * b(1,i,iel,ig) + sigg(4,ig,iel) * b(2, i, iel, ig)) * area(iel)/4.d0
            inrf(id + 2) = inrf(id + 2)+(sigg(4,ig,iel) * b(1,i,iel,ig) + sigg(2,ig,iel) * b(2, i, iel, ig)) * area(iel)/4.d0
            grvf(id + 1) = grvf(id + 1) + area(iel) * matprop(3) * hs(i, iel, ig) * gx /4.d0
            grvf(id + 2) = grvf(id + 2) + area(iel) * matprop(3) * hs(i, iel, ig) * gy /4.d0
            mas(id + 1) = mas(id + 1) + area(iel) * matprop(3) * hs(i, iel, ig) /4.d0
            mas(id + 2) = mas(id + 2) + area(iel) * matprop(3) * hs(i, iel, ig) /4.d0
        end do
    enddo !gauss
end do !nel 

!$omp end parallel do

end subroutine Map2Nod

0 个答案:

没有答案