Files
Victor Eijkhout b13edff125 initial upload
2022-11-13 14:03:01 -06:00

100 lines
2.4 KiB
Fortran

!****************************************************************
!***
!*** This file belongs with the course
!*** Introduction to Scientific Programming in C++/Fortran2003
!*** copyright 2017 Victor Eijkhout eijkhout@tacc.utexas.edu
!***
!*** mult.F90 : multiplying matrices
!***
!****************************************************************
Program Mult
implicit none
integer,parameter :: N=1000
real(8),dimension(N,N) :: A,B,C,Reference
real(8) :: acc
integer :: i,j,k
!!codesnippet fclock
integer :: clockrate,clock_start,clock_end
call system_clock(count_rate=clockrate)
!!codesnippet end
print *,"Clock resolution:",clockrate
! Initialize the matrix
call random_number(A)
call random_number(B)
!!codesnippet fclock
call system_clock(clock_start)
!!codesnippet end
do i=1,N
do j=1,N
acc = 0
do k=1,N
acc = acc + A(i,k)*B(k,j)
end do
Reference(i,j) = acc
end do
end do
!!codesnippet fclock
call system_clock(clock_end)
print *,"time:",(clock_end-clock_start)/REAL(clockrate)
!!codesnippet end
call system_clock(clock_start)
do i=1,N
do j=1,N
C(i,j) = DOT_PRODUCT( A(i,:),B(:,j) )
end do
end do
call system_clock(clock_end)
print *,"Inner product:",(clock_end-clock_start)/REAL(clockrate)
print 10,MAXVAL( ABS( C-Reference ) )
call system_clock(clock_start)
C = MATMUL(A,B)
call system_clock(clock_end)
print *,"Matmul:",(clock_end-clock_start)/REAL(clockrate)
print 10,MAXVAL( ABS( C-Reference ) )
C = 0
call system_clock(clock_start)
do j=1,N
do k=1,N
C(:,j) = C(:,j) + A(:,k) * B(k,j)
end do
end do
call system_clock(clock_end)
print *,"Columns:",(clock_end-clock_start)/REAL(clockrate)
print 10,MAXVAL( ABS( C-Reference ) )
C = 0
call system_clock(clock_start)
do i=1,N
do k=1,N
C(i,:) = C(i,:) + A(i,k) * B(k,:)
end do
end do
call system_clock(clock_end)
print *,"Rows:",(clock_end-clock_start)/REAL(clockrate)
print 10,MAXVAL( ABS( C-Reference ) )
C = 0
call system_clock(clock_start)
do i=1,N
do k=1,N
do j=1,N
C(i,j) = C(i,j) + A(i,k) * B(k,j)
end do
end do
end do
call system_clock(clock_end)
print *,"Rows, elt:",(clock_end-clock_start)/REAL(clockrate)
print 10,MAXVAL( ABS( C-Reference ) )
10 FORMAT( x,3H (,"error:",x,e12.6,1H) )
End Program Mult