From 7a3dc61f1205a30d09e5e6662c1eecd651c92fd5 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Thu, 25 Apr 2019 13:05:18 +0200 Subject: make selection between floating point types possible --- src/main.F90 | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 5 deletions(-) diff --git a/src/main.F90 b/src/main.F90 index 43eeabb..be9dd58 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -6,17 +6,17 @@ PROGRAM mul integer, parameter :: seed = 123456 real :: time - integer :: dim = 10, multype = 1, realtype = 4 + integer :: dim = 10, multype = 1, realtype = 8 DO WHILE (dim < 2000) SELECT CASE(realtype) CASE (4) time = measure_4(dim) - ! CASE (8) - ! time = measure_8(dim) - ! CASE (16) - ! time = measure_16(dim) + CASE (8) + time = measure_8(dim) + CASE (16) + time = measure_16(dim) CASE default write (*, *) "wrong kind for real: ", realtype @@ -73,5 +73,75 @@ CONTAINS time = end - start END FUNCTION measure_4 + + real FUNCTION measure_8(dim) result(time) + integer, intent(in) :: dim + real(kind=8), dimension(:,:), allocatable :: mat1, mat2, res + real :: start, end + + call init_random_seed() + + allocate(mat1(dim,dim)) + allocate(mat2(dim,dim)) + allocate(res(dim,dim)) + + call random_number(mat1) + call random_number(mat2) + + call cpu_time(start) + + SELECT CASE(multype) + CASE (1) + res = naivmull(mat1, mat2) + CASE (2) + res = bettmull(mat1, mat2) + CASE (3) + res = dotmull(mat1, mat2) + CASE default + res = matmul(mat1, mat2) + + END SELECT + + call cpu_time(end) + + time = end - start + + END FUNCTION measure_8 + + + real FUNCTION measure_16(dim) result(time) + integer, intent(in) :: dim + real(kind=16), dimension(:,:), allocatable :: mat1, mat2, res + real :: start, end + + call init_random_seed() + + allocate(mat1(dim,dim)) + allocate(mat2(dim,dim)) + allocate(res(dim,dim)) + + call random_number(mat1) + call random_number(mat2) + + call cpu_time(start) + + SELECT CASE(multype) + CASE (1) + res = naivmull(mat1, mat2) + CASE (2) + res = bettmull(mat1, mat2) + CASE (3) + res = dotmull(mat1, mat2) + CASE default + res = matmul(mat1, mat2) + + END SELECT + + call cpu_time(end) + + time = end - start + + END FUNCTION measure_16 + END PROGRAM mul -- cgit v1.2.3