1#!/usr/local/bin/bash
2###############################################################################
3# Copyright (c) Intel Corporation - All rights reserved.                      #
4# This file is part of the LIBXSMM library.                                   #
5#                                                                             #
6# For information on the license, see the LICENSE file.                       #
7# Further information: https://github.com/hfp/libxsmm/                        #
8# SPDX-License-Identifier: BSD-3-Clause                                       #
9###############################################################################
10
11if [ $1 = "-h" ]
12then
13  echo "Usage: $(basename $0) matrices.txt iters numa (1-mcdram/0-DDR)"
14  exit
15fi
16
17if [[ -z "${OMP_NUM_THREADS}" ]]; then
18  echo "using defaults for OMP settings!"
19  export KMP_HW_SUBSET=1T
20  export KMP_AFFINITY=compact,granularity=fine
21  export KMP_AFFINITY=proclist=[1-67],granularity=thread,explicit,norespect
22  export OMP_NUM_THREADS=67
23else
24  echo "using environment OMP settings!"
25fi
26
27
28_fn=${1:-"deepbench_matrices.txt"}
29_it=${2:-100}
30NUMA=${3:-1}
31
32NUMACTL="${TOOL_COMMAND}"
33CPUFLAGS=$(if [ -e /proc/cpuinfo ]; then grep -m1 flags /proc/cpuinfo | cut -d: -f2-; fi)
34if [ "" != "$(echo "${CPUFLAGS}" | grep -o avx512er)" ]; then
35  if [ "0" != "$((NUMA < $(numactl -H | grep "node  " | tr -s " " | cut -d" " -f2- | wc -w | tr -d " ")))" ]; then
36    NUMACTL="numactl --preferred=${NUMA} ${TOOL_COMMAND}"
37  fi
38fi
39NUMACTL="numactl --interleave=0,1"
40
41#----bgemm parameters
42_MB_="24 48 64"
43_NB_="24 48 64"
44_KB_="24 48 64 96"
45#mb1="0.1 0.2 0.3 0.4 0.5 0.8 0.16 0.32 1 2 4 8 10 16"
46#nb1="0.1 0.2 0.3 0.4 0.5 0.8 0.16 0.32 1 2 4 8 10 16"
47#kb1="0.1 0.2 0.3 0.4 0.5 0.8 0.16 0.32 1 2 4 8 10 16"
48#kb2="0.1 0.2 0.3 0.4 0.5 0.8 0.16 0.32 1 2 4 8 10 16"
49MBT=4096
50NBT=4096
51KBT=4096
52mb11="0.1"
53nb11="0.1"
54kb11="0.1"
55mb12="0.1"
56nb12="0.1"
57kb12="0.1"
58kb2="0.1 0.2 0.4 0.5 0.8 0.16 0.24 0.32"
59order="0 1 2"
60perflog="perfSweep.log"
61
62function bgemm_test {
63best="0"
64echo "M=$M N=$N K=$K it=$it"
65bin="$NUMACTL ./bgemm"
66log="$((M))_$((N))_$((K)).out"
67for _mb in $mb
68do
69  for _nb in $nb
70  do
71    for _kb in $kb
72    do
73      for _mb1 in $mb1
74      do
75        for _nb1 in $nb1
76        do
77          for _kb1 in $kb1
78          do
79            for _kb2 in $kb2
80            do
81              for _o in $order
82              do
83                _M=$M
84                _N=$N
85                _K=$K
86                if [[ "$((M % _mb))" -gt 0 ]]
87                then
88                  _M=$((_mb*(M/_mb+1)))
89                fi
90                if [[ "$((N % _nb))" -gt 0 ]]
91                then
92                  _N=$((_nb*(N/_nb+1)))
93                fi
94                if [[ "$((K % _kb))" -gt 0 ]]
95                then
96                  _K=$((_kb*(K/_kb+1)))
97                fi
98                if [ $(bc <<< "$_mb1 < 1") -eq 1 ]; then
99                  IFS="." read temp _MB1 <<< $_mb1
100                else
101                  _MB1=$(($_M/$_mb1))
102                fi
103                if [ $(bc <<< "$_nb1 < 1") -eq 1 ]; then
104                  IFS="." read temp _NB1 <<< $_nb1
105                else
106                  _NB1=$(($_N/$_nb1))
107                fi
108                if [ $(bc <<< "$_kb1 < 1") -eq 1 ]; then
109                  IFS="." read temp _KB1 <<< $_kb1
110                else
111                  _KB1=$(($_K/$_kb1))
112                fi
113                if [ $(bc <<< "$_kb2 < 1") -eq 1 ]; then
114                  IFS="." read temp _KB2 <<< $_kb2
115                else
116                  _KB2=$(($_K/$_kb2))
117                fi
118                echo "$bin $_M $_N $_K $_mb $_nb $_kb $_o $it $_MB1 $_NB1 $_KB1 $_KB2"
119                $bin $_M $_N $_K $_mb $_nb $_kb $_o $it $_MB1 $_NB1 $_KB1 $_KB2 > /dev/null
120                $bin $_M $_N $_K $_mb $_nb $_kb $_o $it $_MB1 $_NB1 $_KB1 $_KB2 > temp.out
121                prf="$(grep "LIBXSMM" temp.out | awk {'print $2;'})"
122                cfg="$_M $_N $_K $_mb $_nb $_kb $_o $it $_MB1 $_NB1 $_KB1 $_KB2"
123                echo "$cfg $prf" >> $log
124              done
125            done
126          done
127        done
128      done
129    done
130  done
131done
132best=$(cat $log | awk ' BEGIN { val = 0 } { if ($13 > val) {val = $13; best=$0} } END { print best }')
133echo "$best" >> $perflog
134}
135
136
137function run_bsgemm {
138M=$1
139N=$2
140K=$3
141_AT=$4
142_BT=$5
143if [[ $# -gt 5 ]]
144then
145  mb=$6
146  nb=$7
147  kb=$8
148else
149  mb=24
150  nb=24
151  kb=24
152fi
153#_it=$9
154#_bin=$7
155
156if [[ "$mb" -gt "$M" ]]
157then
158  mb=$M
159else
160  mb=$_MB_
161fi
162if [[ "$nb" -gt "$N" ]]
163then
164  nb=$N
165else
166  nb=$_NB_
167fi
168if [[ "$kb" -gt "$K" ]]
169then
170  kb=$K
171else
172  kb=$_KB_
173fi
174if [[ "$M" -gt "$MBT" ]]; then
175  mb1=$mb12
176else
177  mb1=$mb11
178fi
179if [[ "$N" -gt "$NBT" ]]; then
180  nb1=$nb12
181else
182  nb1=$nb11
183fi
184if [[ "$K" -gt "$KBT" ]]; then
185  kb1=$kb12
186else
187  kb1=$kb11
188fi
189_Trans=0
190if [[ "$_AT" == "T" ]]
191then
192  _Trans=1
193  echo "!!! $M $N $K $_AT $_BT - Not supported !!!, doing $N $M $K N N instead"
194  t_M=$M
195  t_mb=$mb
196  M=$N
197  N=$t_M
198  mb=$nb
199  nb=$t_mb
200fi
201if [[ "$_BT" == "T" ]]
202then
203  _Trans=2
204  echo "!!! $M $N $K $_AT $_BT - Not supported !!!, doing $M $K $N N N instead"
205  t_K=$K
206  t_kb=$kb
207  K=$N
208  N=$t_K
209  kb=$nb
210  nb=$t_kb
211fi
212
213if [[ "$M" -gt "2000" ]]; then
214  if [[ "$N" -gt "2000" ]]; then
215    if [[ "$K" -gt "2000" ]]; then
216      it=10
217    fi
218  fi
219fi
220
221if [[ "$M" -gt "4000" ]]; then
222  it=10
223fi
224
225if [[ "$N" -gt "4000" ]]; then
226  it=10
227fi
228if [[ "$K" -gt "4000" ]]; then
229  it=10
230fi
231
232bgemm_test
233echo "--------------------------------------------------------------------------------------"
234}
235
236nc=$(wc -l $_fn)
237idx=1
238
239cat $_fn | while read line
240do
241  if [ ! -z "$line" ]; then
242    echo -n "($idx/$nc)"
243    it=$_it
244    run_bsgemm $line
245  fi
246  idx=$((idx+1))
247done
248
249