1!=======================================================================! 2! Copyright (c) Intel Corporation - All rights reserved. ! 3! This file is part of the LIBXSMM library. ! 4! ! 5! For information on the license, see the LICENSE file. ! 6! Further information: https://github.com/hfp/libxsmm/ ! 7! SPDX-License-Identifier: BSD-3-Clause ! 8!=======================================================================! 9! Hans Pabst (Intel Corp.) 10!=======================================================================! 11 12 PROGRAM diff 13 USE :: LIBXSMM, ONLY: LIBXSMM_TICKINT_KIND, & 14 & libxsmm_timer_duration, & 15 & libxsmm_timer_tick, & 16 & libxsmm_init, & 17 & libxsmm_diff 18 IMPLICIT NONE 19 20 INTEGER, PARAMETER :: W = 34 21 INTEGER, PARAMETER :: T = 4 22 23 INTEGER(T), ALLOCATABLE, TARGET :: a(:), b(:) 24 !DIR$ ATTRIBUTES ALIGN:64 :: a, b 25 INTEGER(LIBXSMM_TICKINT_KIND) :: start 26 DOUBLE PRECISION :: duration(3), d 27 INTEGER :: i, n, nrepeat 28 INTEGER(8) :: nbytes 29 30 CHARACTER(32) :: argv 31 INTEGER :: argc 32 33 argc = COMMAND_ARGUMENT_COUNT() 34 IF (1 <= argc) THEN 35 CALL GET_COMMAND_ARGUMENT(1, argv) 36 READ(argv, "(I32)") n 37 ELSE 38 n = 0 39 END IF 40 IF (2 <= argc) THEN 41 CALL GET_COMMAND_ARGUMENT(2, argv) 42 READ(argv, "(I32)") nrepeat 43 ELSE 44 nrepeat = 5 45 END IF 46 47 duration = 0D0 48 n = MERGE(n, ISHFT(ISHFT(2, 20) / T, 10), 0 < n) ! 2 GB by default 49 nbytes = INT(n, 8) * T 50 WRITE(*, "(A,I0,A,I0,A,A,I0,A)") & 51 & "nelements=", n, " typesize=", T, "Byte", & 52 & " size=", nbytes / ISHFT(1, 20), "MB" 53 CALL libxsmm_init() 54 55 ALLOCATE(a(n), b(n)) 56 DO i = 1, n 57 a(i) = i - 1 58 b(i) = i - 1 59 END DO 60 61 WRITE(*, "(A)") REPEAT("-", W) 62 DO i = 1, nrepeat 63 start = libxsmm_timer_tick() 64 IF (.NOT. libxsmm_diff(a, b)) THEN 65 d = libxsmm_timer_duration(start, libxsmm_timer_tick()) 66 duration(1) = duration(1) + d 67 WRITE(*, "(A,F10.1,A)") "DIFF (LIBXSMM):", 1D3 * d, " ms" 68 ELSE 69 WRITE(*, "(A)") "Validation failed!" 70 END IF 71 72 start = libxsmm_timer_tick() 73 IF (ALL(a .EQ. b)) THEN 74 d = libxsmm_timer_duration(start, libxsmm_timer_tick()) 75 duration(2) = duration(2) + d 76 WRITE(*, "(A,F10.1,A)") "ALL (Fortran):", 1D3 * d, " ms" 77 ELSE 78 WRITE(*, "(A)") "Validation failed!" 79 END IF 80 81 start = libxsmm_timer_tick() 82 IF (.NOT. ANY(a .NE. b)) THEN 83 d = libxsmm_timer_duration(start, libxsmm_timer_tick()) 84 duration(3) = duration(3) + d 85 WRITE(*, "(A,F10.1,A)") "ANY (Fortran):", 1D3 * d, " ms" 86 ELSE 87 WRITE(*, "(A)") "Validation failed!" 88 END IF 89 WRITE(*, "(A)") REPEAT("-", W) 90 END DO 91 92 IF (ALL(0 .LT. duration)) THEN 93 WRITE(*, "(A,I0,A)") "Arithmetic average of ", & 94 & nrepeat, " iterations" 95 WRITE(*, "(A)") REPEAT("-", W) 96 WRITE(*, "(A,F10.1,A)") "DIFF (LIBXSMM):", & 97 & REAL(nbytes, 8) * REAL(nrepeat, 8) / & 98 & (duration(1) * REAL(ISHFT(1, 20), 8)), " MB/s" 99 WRITE(*, "(A,F10.1,A)") "ALL (Fortran):", & 100 & REAL(nbytes, 8) * REAL(nrepeat, 8) / & 101 & (duration(2) * REAL(ISHFT(1, 20), 8)), " MB/s" 102 WRITE(*, "(A,F10.1,A)") "ANY (Fortran):", & 103 & REAL(nbytes, 8) * REAL(nrepeat, 8) / & 104 & (duration(3) * REAL(ISHFT(1, 20), 8)), " MB/s" 105 WRITE(*, "(A)") REPEAT("-", W) 106 END IF 107 108 DEALLOCATE(a, b) 109 END PROGRAM 110 111