Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program mvmul_test
- implicit none;
- integer, parameter :: m=2000,n=1000;
- integer :: i,j;
- integer, parameter :: iterations = 15;
- integer, parameter :: kfloat = kind(0.D0);
- real(kind=kfloat), dimension(1:n,1:m) :: A;
- real(kind=kfloat), dimension(1:m) :: x;
- real(kind=kfloat), dimension(1:n) :: y1, y2;
- real(kind=kfloat) :: t1, t2, t_naive, t_optimized;
- do i = 1,m
- x(i) = 1.0
- do j = 1,n
- A(i,j) = (-1.0)**(i-j);
- end do
- end do
- call cpu_time(t1);
- do i = 1,iterations
- call naive(A, m, n, x, y1);
- end do
- call cpu_time(t2);
- t_naive = (t2-t1)/iterations;
- call cpu_time(t1);
- do i = 1,iterations
- call optimized(A, m, n, x, y2);
- end do
- call cpu_time(t2);
- t_optimized = t2-t1/iterations;
- if( all(y1 == y2) ) then
- write(*,*) "Vectors match! Calculations are OK.";
- endif
- write(*,*) "Optimized time:", t_optimized
- write(*,*) "Naive time:", t_naive;
- write(*,*) "Ratio (t_optimized/t_naive):", t_optimized/t_naive
- !-------------------------------------------------------------------------
- contains
- subroutine naive(A, m, n, x, y)
- implicit none;
- real(kind=kfloat), dimension(1:n,1:m), intent(in) :: A;
- real(kind=kfloat), dimension(1:m), intent(in) :: x;
- real(kind=kfloat), dimension(1:n), intent(out) :: y;
- integer, intent(in) :: m, n;
- integer :: i,j;
- do i = 1,n
- y(i) = 0.0;
- end do
- do i = 1,n
- do j = 1,m
- y(i) = y(i) + A(i,j)*x(j);
- end do
- end do
- end subroutine
- subroutine optimized(A, m, n, x, y)
- implicit none;
- real(kind=kfloat), dimension(1:n,1:m), intent(in) :: A;
- real(kind=kfloat), dimension(1:m), intent(in) :: x;
- real(kind=kfloat), dimension(1:n), intent(out) :: y;
- integer, intent(in) :: m, n;
- integer :: i,j;
- do i = 1,n
- y(i) = 0.0;
- end do
- do j = 1,m
- do i = 1,n
- y(i) = y(i) + A(i,j)*x(j);
- end do
- end do
- end subroutine
- end program
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement