为什么大矩阵像较小的矩阵一样快地通过几个子程序任务

时间:2016-09-28 18:36:51

标签: matrix time fortran derived-types

我的矩阵究竟发生了什么? Fortran如何处理它?<​​/ h2>

附带的内容是一个受大片启发的代码片段 模拟眼组织中光传输的项目。它 通过子程序传递一些大型矩阵然后 随机地将值放入其中。

我的目标:了解如何通过如此大的矩阵 几个子程序会产生影响 性能

我的参考:完全相同的代码,除了感兴趣的矩阵的维度现在是[5,5](之前是[250,200])

我的问题:为什么结果没有显着差异?

我的结果

  • MATRIX A_rz维度[250,200]

    真实的0m6.661s

    用户0m6.638s

    sys 0m0.012s

  • MATRIX A_rz维[5,5]

    真实的0m6.508s

    用户0m6.489s

    sys 0m0.011s

** bMatMOD.f90

module bMatMOD
  implicit none

  type :: INPUT
     integer :: nLayers = 1
     integer :: nPhotons = 50000000
     real, dimension (2) :: dZR = (/0.0004, 0.001/)
     integer, dimension(3) :: nZRA = (/250,200,30/)
     real, dimension (1) :: d = (/0.03/)
  end type INPUT

  type :: OUTPUT
     real, allocatable :: Rd_ra(:,:)
     real, allocatable :: A_rz(:,:)
     real, allocatable :: Tt_ra(:,:)
  end type OUTPUT

contains

  subroutine initOUTPUTS (in_INPUT,out_OUTPUT)
    type (INPUT), intent (in) :: in_INPUT
    type (OUTPUT),intent (out) :: out_OUTPUT

    allocate (out_OUTPUT%A_rz(in_INPUT%nZRA(2),in_INPUT%nZRA(1)))
    allocate (out_OUTPUT%Rd_ra(in_INPUT%nZRA(2),in_INPUT%nZRA(3)))
    allocate (out_OUTPUT%Tt_ra(in_INPUT%nZRA(2),in_INPUT%nZRA(3)))

    out_OUTPUT%A_rz = 0.0
    out_OUTPUT%Rd_ra = 0.0
    out_OUTPUT%Tt_ra = 0.0

    return
  end subroutine initOUTPUTS

end module bMatMOD

** bMatRoutines.f90

subroutine A (o)
  use bMatMOD
  type (OUTPUT) :: o
  real :: rnd1, rnd2

  rnd1 = rand()
  rnd2 = rand()

  call B(o,rnd1,rnd2)

  return
end subroutine A

subroutine B (o,x,y)
  use bMatMOD
  type (OUTPUT) :: o
  real, intent (in) :: x
  real, intent (in) :: y
  integer, dimension(2) :: temp
  integer :: i, j

  temp = SHAPE(o%A_rz)
  i = INT(temp(1)*y)
  j = INT(temp(2)*x)

  if ( i .eq. 0) then
     i = 1
  endif  
  if (i .eq. temp(1)) then
     i = i - 1
  endif  
  if (j .eq. 0) then
     j = 1
  endif  
  if (j .eq. temp(2)) then
     j = j - 1
  endif

  o%A_rz(i,j) = o%A_rz(i,j) + x + y

  return
end subroutine B

** bMatmcml.f90

program bMatmcml
  use bMatMOD

  implicit none
  type (INPUT) :: u
  type (OUTPUT) :: o
  integer :: i

  call initOUTPUTS(u,o)

  call srand(0)

  do i = 1,u%nPhotons,1
     call A(o)
  enddo  

end program bMatmcml

** bMat.sh

rm -f *.o *~ *.exe
echo "MATRIX A_rz dimension [250,200]"
gfortran bMatMOD.f90 bMatRoutines.f90 bMatmcml.f90 -g -Wall -Werror -O3 -ffast-math  -o bMat.exe
time ./bMat.exe

echo "MATRIX A_rz dimension [5,5]"
gfortran bMatMOD-v1.f90 bMatRoutines.f90 bMatmcml.f90 -g -Wall -Werror -O3 -ffast-math -o bMat-v1.exe
time ./bMat.exe

0 个答案:

没有答案