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