blob: db10486e8a0760486dbca6d3ffdc899064d2d961 [file] [log] [blame]
module matrix
implicit none
integer :: n = 10
integer :: m = 10
contains
function mult (a, b) result (c)
integer, allocatable, dimension (:,:) :: a,b,c
integer :: i, j, k, inner
allocate(c(n, m))
do i = 1,10
do j = 1,n
c(j,i) = 0
end do
end do
!$omp unroll partial(10)
!$omp tile sizes(1, 3)
do i = 1,10
do j = 1,n
do k = 1, n
c(j,i) = c(j,i) + a(k, i) * b(j, k)
end do
end do
end do
end function mult
function mult2 (a, b) result (c)
integer, allocatable, dimension (:,:) :: a,b,c
integer :: i, j, k, inner
allocate(c(n, m))
do i = 1,10
do j = 1,n
c(j,i) = 0
end do
end do
!$omp unroll partial(2)
!$omp tile sizes(1,2)
do i = 1,10
do j = 1,n
do k = 1, n
c(j,i) = c(j,i) + a(k, i) * b(j, k)
end do
end do
end do
end function mult2
subroutine print_matrix (m)
integer, allocatable :: m(:,:)
integer :: i, j, n
n = size (m, 1)
do i = 1,n
do j = 1,n
write (*, fmt="(i4)", advance='no') m(j, i)
end do
write (*, *) ""
end do
write (*, *) ""
end subroutine
end module matrix
program main
use matrix
implicit none
integer, allocatable :: a(:,:), b(:,:), c(:,:), d(:, :)
integer :: i, j
allocate(a(n, m))
allocate(b(n, m))
do i = 1,n
do j = 1,m
a(j,i) = merge(1,0, i.eq.j)
b(j,i) = j
end do
end do
d = mult (a, b)
call print_matrix (a)
call print_matrix (b)
call print_matrix (d)
do i = 1,n
do j = 1,m
if (b(i,j) .ne. d(i,j)) stop 1
end do
end do
c = mult2 (a, b)
call print_matrix (a)
call print_matrix (b)
call print_matrix (c)
do i = 1,n
do j = 1,m
if (b(i,j) .ne. c(i,j)) stop 2
end do
end do
end program main