File: diff.f

package info (click to toggle)
libxsmm 1.17-4
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 14,976 kB
  • sloc: ansic: 119,587; cpp: 27,680; fortran: 9,179; sh: 5,765; makefile: 5,040; pascal: 2,312; python: 1,812; f90: 1,773
file content (110 lines) | stat: -rw-r--r-- 4,323 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
!=======================================================================!
! Copyright (c) Intel Corporation - All rights reserved.                !
! This file is part of the LIBXSMM library.                             !
!                                                                       !
! For information on the license, see the LICENSE file.                 !
! Further information: https://github.com/hfp/libxsmm/                  !
! SPDX-License-Identifier: BSD-3-Clause                                 !
!=======================================================================!
! Hans Pabst (Intel Corp.)
!=======================================================================!

      PROGRAM diff
        USE :: LIBXSMM, ONLY: LIBXSMM_TICKINT_KIND,                     &
     &                        libxsmm_timer_duration,                   &
     &                        libxsmm_timer_tick,                       &
     &                        libxsmm_init,                             &
     &                        libxsmm_diff
        IMPLICIT NONE

        INTEGER, PARAMETER :: W = 34
        INTEGER, PARAMETER :: T = 4

        INTEGER(T), ALLOCATABLE, TARGET :: a(:), b(:)
        !DIR$ ATTRIBUTES ALIGN:64 :: a, b
        INTEGER(LIBXSMM_TICKINT_KIND) :: start
        DOUBLE PRECISION :: duration(3), d
        INTEGER :: i, n, nrepeat
        INTEGER(8) :: nbytes

        CHARACTER(32) :: argv
        INTEGER :: argc

        argc = COMMAND_ARGUMENT_COUNT()
        IF (1 <= argc) THEN
          CALL GET_COMMAND_ARGUMENT(1, argv)
          READ(argv, "(I32)") n
        ELSE
          n = 0
        END IF
        IF (2 <= argc) THEN
          CALL GET_COMMAND_ARGUMENT(2, argv)
          READ(argv, "(I32)") nrepeat
        ELSE
          nrepeat = 5
        END IF

        duration = 0D0
        n = MERGE(n, ISHFT(ISHFT(2, 20) / T, 10), 0 < n) ! 2 GB by default
        nbytes = INT(n, 8) * T
        WRITE(*, "(A,I0,A,I0,A,A,I0,A)")                                &
     &    "nelements=", n, " typesize=", T, "Byte",                     &
     &    " size=", nbytes / ISHFT(1, 20), "MB"
        CALL libxsmm_init()

        ALLOCATE(a(n), b(n))
        DO i = 1, n
          a(i) = i - 1
          b(i) = i - 1
        END DO

        WRITE(*, "(A)") REPEAT("-", W)
        DO i = 1, nrepeat
          start = libxsmm_timer_tick()
          IF (.NOT. libxsmm_diff(a, b)) THEN
            d = libxsmm_timer_duration(start, libxsmm_timer_tick())
            duration(1) = duration(1) + d
            WRITE(*, "(A,F10.1,A)") "DIFF (LIBXSMM):", 1D3 * d, " ms"
          ELSE
            WRITE(*, "(A)") "Validation failed!"
          END IF

          start = libxsmm_timer_tick()
          IF (ALL(a .EQ. b)) THEN
            d = libxsmm_timer_duration(start, libxsmm_timer_tick())
            duration(2) = duration(2) + d
            WRITE(*, "(A,F10.1,A)") "ALL  (Fortran):", 1D3 * d, " ms"
          ELSE
            WRITE(*, "(A)") "Validation failed!"
          END IF

          start = libxsmm_timer_tick()
          IF (.NOT. ANY(a .NE. b)) THEN
            d = libxsmm_timer_duration(start, libxsmm_timer_tick())
            duration(3) = duration(3) + d
            WRITE(*, "(A,F10.1,A)") "ANY  (Fortran):", 1D3 * d, " ms"
          ELSE
            WRITE(*, "(A)") "Validation failed!"
          END IF
          WRITE(*, "(A)") REPEAT("-", W)
        END DO

        IF (ALL(0 .LT. duration)) THEN
          WRITE(*, "(A,I0,A)") "Arithmetic average of ",                &
     &      nrepeat, " iterations"
          WRITE(*, "(A)") REPEAT("-", W)
          WRITE(*, "(A,F10.1,A)") "DIFF (LIBXSMM):",                    &
     &      REAL(nbytes, 8) * REAL(nrepeat, 8) /                        &
     &      (duration(1) * REAL(ISHFT(1, 20), 8)), " MB/s"
          WRITE(*, "(A,F10.1,A)") "ALL  (Fortran):",                    &
     &      REAL(nbytes, 8) * REAL(nrepeat, 8) /                        &
     &      (duration(2) * REAL(ISHFT(1, 20), 8)), " MB/s"
          WRITE(*, "(A,F10.1,A)") "ANY  (Fortran):",                    &
     &      REAL(nbytes, 8) * REAL(nrepeat, 8) /                        &
     &      (duration(3) * REAL(ISHFT(1, 20), 8)), " MB/s"
          WRITE(*, "(A)") REPEAT("-", W)
        END IF

        DEALLOCATE(a, b)
      END PROGRAM