mirror of
https://github.com/VictorEijkhout/TheArtOfHPC_vol3_cppf08programming.git
synced 2026-01-24 22:44:48 +09:00
100 lines
2.4 KiB
Fortran
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
|