7 integer, parameter :: seed = 123456
9 integer :: dim = 10, multype = 1, realtype = 8
19 time = measure_16(dim)
21 write (*, *) "wrong kind for real: ", realtype
25 print '(I11," ",ES11.5)', dim, time
33 SUBROUTINE init_random_seed()
36 call random_seed(size = n)
38 call random_seed(put = (/ ((seed + i) * 37, i = 1, n) /))
40 END SUBROUTINE init_random_seed
43 real FUNCTION measure_4(dim) result(time)
44 integer, intent(in) :: dim
45 real(kind=4), dimension(:,:), allocatable :: mat1, mat2, res
48 call init_random_seed()
50 allocate(mat1(dim,dim))
51 allocate(mat2(dim,dim))
52 allocate(res(dim,dim))
54 call random_number(mat1)
55 call random_number(mat2)
61 res = naivmull(mat1, mat2)
63 res = bettmull(mat1, mat2)
65 res = dotmull(mat1, mat2)
67 res = matmul(mat1, mat2)
75 END FUNCTION measure_4
78 real FUNCTION measure_8(dim) result(time)
79 integer, intent(in) :: dim
80 real(kind=8), dimension(:,:), allocatable :: mat1, mat2, res
83 call init_random_seed()
85 allocate(mat1(dim,dim))
86 allocate(mat2(dim,dim))
87 allocate(res(dim,dim))
89 call random_number(mat1)
90 call random_number(mat2)
96 res = naivmull(mat1, mat2)
98 res = bettmull(mat1, mat2)
100 res = dotmull(mat1, mat2)
102 res = matmul(mat1, mat2)
110 END FUNCTION measure_8
113 real FUNCTION measure_16(dim) result(time)
114 integer, intent(in) :: dim
115 real(kind=16), dimension(:,:), allocatable :: mat1, mat2, res
118 call init_random_seed()
120 allocate(mat1(dim,dim))
121 allocate(mat2(dim,dim))
122 allocate(res(dim,dim))
124 call random_number(mat1)
125 call random_number(mat2)
131 res = naivmull(mat1, mat2)
133 res = bettmull(mat1, mat2)
135 res = dotmull(mat1, mat2)
137 res = matmul(mat1, mat2)
145 END FUNCTION measure_16