cannam@95
|
1 #! /usr/bin/perl -w
|
cannam@95
|
2
|
cannam@95
|
3 $program = "./bench";
|
cannam@95
|
4 $default_options = "";
|
cannam@95
|
5 $verbose = 0;
|
cannam@95
|
6 $paranoid = 0;
|
cannam@95
|
7 $exhaustive = 0;
|
cannam@95
|
8 $patient = 0;
|
cannam@95
|
9 $estimate = 0;
|
cannam@95
|
10 $wisdom = 0;
|
cannam@95
|
11 $nthreads = 1;
|
cannam@95
|
12 $rounds = 0;
|
cannam@95
|
13 $maxsize = 60000;
|
cannam@95
|
14 $maxcount = 100;
|
cannam@95
|
15 $do_0d = 0;
|
cannam@95
|
16 $do_1d = 0;
|
cannam@95
|
17 $do_2d = 0;
|
cannam@95
|
18 $do_random = 0;
|
cannam@95
|
19 $keepgoing = 0;
|
cannam@95
|
20 $flushcount = 42;
|
cannam@95
|
21
|
cannam@95
|
22 $mpi = 0;
|
cannam@95
|
23 $mpi_transposed_in = 0;
|
cannam@95
|
24 $mpi_transposed_out = 0;
|
cannam@95
|
25
|
cannam@95
|
26 sub make_options {
|
cannam@95
|
27 my $options = $default_options;
|
cannam@95
|
28 $options = "--verify-rounds=$rounds $options" if $rounds;
|
cannam@95
|
29 $options = "--verbose=$verbose $options" if $verbose;
|
cannam@95
|
30 $options = "-o paranoid $options" if $paranoid;
|
cannam@95
|
31 $options = "-o exhaustive $options" if $exhaustive;
|
cannam@95
|
32 $options = "-o patient $options" if $patient;
|
cannam@95
|
33 $options = "-o estimate $options" if $estimate;
|
cannam@95
|
34 $options = "-o wisdom $options" if $wisdom;
|
cannam@95
|
35 $options = "-o nthreads=$nthreads $options" if ($nthreads > 1);
|
cannam@95
|
36 $options = "-obflag=30 $options" if $mpi_transposed_in;
|
cannam@95
|
37 $options = "-obflag=31 $options" if $mpi_transposed_out;
|
cannam@95
|
38 return $options;
|
cannam@95
|
39 }
|
cannam@95
|
40
|
cannam@95
|
41 @list_of_problems = ();
|
cannam@95
|
42
|
cannam@95
|
43 sub flush_problems {
|
cannam@95
|
44 my $options = shift;
|
cannam@95
|
45 my $problist = "";
|
cannam@95
|
46
|
cannam@95
|
47 if ($#list_of_problems >= 0) {
|
cannam@95
|
48 for (@list_of_problems) {
|
cannam@95
|
49 $problist = "$problist --verify '$_'";
|
cannam@95
|
50 }
|
cannam@95
|
51 print "Executing \"$program $options $problist\"\n"
|
cannam@95
|
52 if $verbose;
|
cannam@95
|
53
|
cannam@95
|
54 system("$program $options $problist");
|
cannam@95
|
55 $exit_value = $? >> 8;
|
cannam@95
|
56 $signal_num = $? & 127;
|
cannam@95
|
57 $dumped_core = $? & 128;
|
cannam@95
|
58
|
cannam@95
|
59 if ($signal_num == 1) {
|
cannam@95
|
60 print "hangup\n";
|
cannam@95
|
61 exit 0;
|
cannam@95
|
62 }
|
cannam@95
|
63 if ($signal_num == 2) {
|
cannam@95
|
64 print "interrupted\n";
|
cannam@95
|
65 exit 0;
|
cannam@95
|
66 }
|
cannam@95
|
67 if ($signal_num == 9) {
|
cannam@95
|
68 print "killed\n";
|
cannam@95
|
69 exit 0;
|
cannam@95
|
70 }
|
cannam@95
|
71
|
cannam@95
|
72 if ($exit_value != 0 || $dumped_core || $signal_num) {
|
cannam@95
|
73 print "FAILED $program: $problist\n";
|
cannam@95
|
74 if ($signal_num) { print "received signal $signal_num\n"; }
|
cannam@95
|
75 exit 1 unless $keepgoing;
|
cannam@95
|
76 }
|
cannam@95
|
77 @list_of_problems = ();
|
cannam@95
|
78 }
|
cannam@95
|
79 }
|
cannam@95
|
80
|
cannam@95
|
81 sub do_problem {
|
cannam@95
|
82 my $problem = shift;
|
cannam@95
|
83 my $doablep = shift;
|
cannam@95
|
84 my $options = &make_options;
|
cannam@95
|
85
|
cannam@95
|
86 if ($problem =~ /\// && $problem =~ /r/
|
cannam@95
|
87 && ($problem =~ /i.*x/
|
cannam@95
|
88 || $problem =~ /v/ || $problem =~ /\*/)) {
|
cannam@95
|
89 return; # cannot do real split inplace-multidimensional or vector
|
cannam@95
|
90 }
|
cannam@95
|
91
|
cannam@95
|
92 # in --mpi mode, restrict to problems supported by MPI code
|
cannam@95
|
93 if ($mpi) {
|
cannam@95
|
94 if ($problem =~ /\//) { return; } # no split
|
cannam@95
|
95 if ($problem =~ /\*/) { return; } # no non-contiguous vectors
|
cannam@95
|
96 if ($problem =~ /r/ && $problem !~ /x/) { return; } # no 1d r2c
|
cannam@95
|
97 if ($problem =~ /k/ && $problem !~ /x/) { return; } # no 1d r2r
|
cannam@95
|
98 if ($mpi_transposed_in || $problem =~ /\[/) {
|
cannam@95
|
99 if ($problem !~ /x/) { return; } # no 1d transposed_in
|
cannam@95
|
100 if ($problem =~ /r/ && $problem !~ /b/) { return; } # only c2r
|
cannam@95
|
101 }
|
cannam@95
|
102 if ($mpi_transposed_out || $problem =~ /\]/) {
|
cannam@95
|
103 if ($problem !~ /x/) { return; } # no 1d transposed_out
|
cannam@95
|
104 if ($problem =~ /r/ && $problem =~ /b/) { return; } # only r2c
|
cannam@95
|
105 }
|
cannam@95
|
106 }
|
cannam@95
|
107
|
cannam@95
|
108 # size-1 redft00 is not defined/doable
|
cannam@95
|
109 return if ($problem =~ /[^0-9]1e00/);
|
cannam@95
|
110
|
cannam@95
|
111 if ($doablep) {
|
cannam@95
|
112 @list_of_problems = ($problem, @list_of_problems);
|
cannam@95
|
113 &flush_problems($options) if ($#list_of_problems > $flushcount);
|
cannam@95
|
114 } else {
|
cannam@95
|
115 print "Executing \"$program $options --can-do $problem\"\n"
|
cannam@95
|
116 if $verbose;
|
cannam@95
|
117 $result=`$program $options --can-do $problem`;
|
cannam@95
|
118 if ($result ne "#f\n" && $result ne "#f\r\n") {
|
cannam@95
|
119 print "FAILED $program: $problem is not undoable\n";
|
cannam@95
|
120 exit 1 unless $keepgoing;
|
cannam@95
|
121 }
|
cannam@95
|
122 }
|
cannam@95
|
123 }
|
cannam@95
|
124
|
cannam@95
|
125 # given geometry, try both directions and in place/out of place
|
cannam@95
|
126 sub do_geometry {
|
cannam@95
|
127 my $geom = shift;
|
cannam@95
|
128 my $doablep = shift;
|
cannam@95
|
129 do_problem("if$geom", $doablep);
|
cannam@95
|
130 do_problem("of$geom", $doablep);
|
cannam@95
|
131 do_problem("ib$geom", $doablep);
|
cannam@95
|
132 do_problem("ob$geom", $doablep);
|
cannam@95
|
133 do_problem("//if$geom", $doablep);
|
cannam@95
|
134 do_problem("//of$geom", $doablep);
|
cannam@95
|
135 do_problem("//ib$geom", $doablep);
|
cannam@95
|
136 do_problem("//ob$geom", $doablep);
|
cannam@95
|
137 }
|
cannam@95
|
138
|
cannam@95
|
139 # given size, try all transform kinds (complex, real, etc.)
|
cannam@95
|
140 sub do_size {
|
cannam@95
|
141 my $size = shift;
|
cannam@95
|
142 my $doablep = shift;
|
cannam@95
|
143 do_geometry("c$size", $doablep);
|
cannam@95
|
144 do_geometry("r$size", $doablep);
|
cannam@95
|
145 }
|
cannam@95
|
146
|
cannam@95
|
147 sub small_0d {
|
cannam@95
|
148 for ($i = 0; $i <= 16; ++$i) {
|
cannam@95
|
149 for ($j = 0; $j <= 16; ++$j) {
|
cannam@95
|
150 for ($vl = 1; $vl <= 5; ++$vl) {
|
cannam@95
|
151 my $ivl = $i * $vl;
|
cannam@95
|
152 my $jvl = $j * $vl;
|
cannam@95
|
153 do_problem("o1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1);
|
cannam@95
|
154 do_problem("i1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1);
|
cannam@95
|
155 do_problem("ok1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1);
|
cannam@95
|
156 do_problem("ik1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1);
|
cannam@95
|
157 }
|
cannam@95
|
158 }
|
cannam@95
|
159 }
|
cannam@95
|
160 }
|
cannam@95
|
161
|
cannam@95
|
162 sub small_1d {
|
cannam@95
|
163 do_size (0, 0);
|
cannam@95
|
164 for ($i = 1; $i <= 100; ++$i) {
|
cannam@95
|
165 do_size ($i, 1);
|
cannam@95
|
166 }
|
cannam@95
|
167 do_size (128, 1);
|
cannam@95
|
168 do_size (256, 1);
|
cannam@95
|
169 do_size (512, 1);
|
cannam@95
|
170 do_size (1024, 1);
|
cannam@95
|
171 do_size (2048, 1);
|
cannam@95
|
172 do_size (4096, 1);
|
cannam@95
|
173 }
|
cannam@95
|
174
|
cannam@95
|
175 sub small_2d {
|
cannam@95
|
176 do_size ("0x0", 0);
|
cannam@95
|
177 for ($i = 1; $i <= 100; ++$i) {
|
cannam@95
|
178 my $ub = 900/$i;
|
cannam@95
|
179 $ub = 100 if $ub > 100;
|
cannam@95
|
180 for ($j = 1; $j <= $ub; ++$j) {
|
cannam@95
|
181 do_size ("${i}x${j}", 1);
|
cannam@95
|
182 }
|
cannam@95
|
183 }
|
cannam@95
|
184 }
|
cannam@95
|
185
|
cannam@95
|
186 sub rand_small_factors {
|
cannam@95
|
187 my $l = shift;
|
cannam@95
|
188 my $n = 1;
|
cannam@95
|
189 my $maxfactor = 13;
|
cannam@95
|
190 my $f = int(rand($maxfactor) + 1);
|
cannam@95
|
191 while ($n * $f < $l) {
|
cannam@95
|
192 $n *= $f;
|
cannam@95
|
193 $f = int(rand($maxfactor) + 1);
|
cannam@95
|
194 };
|
cannam@95
|
195 return $n;
|
cannam@95
|
196 }
|
cannam@95
|
197
|
cannam@95
|
198 # way too complicated...
|
cannam@95
|
199 sub one_random_test {
|
cannam@95
|
200 my $q = int(2 + rand($maxsize));
|
cannam@95
|
201 my $rnk = int(1 + rand(4));
|
cannam@95
|
202 my $vtype = int(rand(3));
|
cannam@95
|
203 my $g = int(2 + exp(log($q) / ($rnk + ($vtype > 0))));
|
cannam@95
|
204 my $first = 1;
|
cannam@95
|
205 my $sz = "";
|
cannam@95
|
206 my $is_r2r = shift;
|
cannam@95
|
207 my @r2r_kinds = ("f", "b", "h",
|
cannam@95
|
208 "e00", "e01", "e10", "e11", "o00", "o01", "o10", "o11");
|
cannam@95
|
209
|
cannam@95
|
210 while ($q > 1 && $rnk > 0) {
|
cannam@95
|
211 my $r = rand_small_factors(int(rand($g) + 10));
|
cannam@95
|
212 if ($r > 1) {
|
cannam@95
|
213 $sz = "${sz}x" if (!$first);
|
cannam@95
|
214 $first = 0;
|
cannam@95
|
215 $sz = "${sz}${r}";
|
cannam@95
|
216 if ($is_r2r) {
|
cannam@95
|
217 my $k = $r2r_kinds[int(1 + rand($#r2r_kinds))];
|
cannam@95
|
218 $sz = "${sz}${k}";
|
cannam@95
|
219 }
|
cannam@95
|
220 $q = int($q / $r);
|
cannam@95
|
221 if ($g > $q) { $g = $q; }
|
cannam@95
|
222 --$rnk;
|
cannam@95
|
223 }
|
cannam@95
|
224 }
|
cannam@95
|
225 if ($vtype > 0 && $g > 1) {
|
cannam@95
|
226 my $v = int(1 + rand($g));
|
cannam@95
|
227 $sz = "${sz}*${v}" if ($vtype == 1);
|
cannam@95
|
228 $sz = "${sz}v${v}" if ($vtype == 2);
|
cannam@95
|
229 }
|
cannam@95
|
230 if ($mpi) {
|
cannam@95
|
231 my $stype = int(rand(3));
|
cannam@95
|
232 $sz = "]${sz}" if ($stype == 1);
|
cannam@95
|
233 $sz = "[${sz}" if ($stype == 2);
|
cannam@95
|
234 }
|
cannam@95
|
235 $sz = "d$sz" if (int(rand(3)) == 0);
|
cannam@95
|
236 if ($is_r2r) {
|
cannam@95
|
237 do_problem("ik$sz", 1);
|
cannam@95
|
238 do_problem("ok$sz", 1);
|
cannam@95
|
239 }
|
cannam@95
|
240 else {
|
cannam@95
|
241 do_size($sz, 1);
|
cannam@95
|
242 }
|
cannam@95
|
243 }
|
cannam@95
|
244
|
cannam@95
|
245 sub random_tests {
|
cannam@95
|
246 my $i;
|
cannam@95
|
247 for ($i = 0; $i < $maxcount; ++$i) {
|
cannam@95
|
248 &one_random_test(0);
|
cannam@95
|
249 &one_random_test(1);
|
cannam@95
|
250 }
|
cannam@95
|
251 }
|
cannam@95
|
252
|
cannam@95
|
253 sub parse_arguments (@)
|
cannam@95
|
254 {
|
cannam@95
|
255 local (@arglist) = @_;
|
cannam@95
|
256
|
cannam@95
|
257 while (@arglist)
|
cannam@95
|
258 {
|
cannam@95
|
259 if ($arglist[0] eq '-v') { ++$verbose; }
|
cannam@95
|
260 elsif ($arglist[0] eq '--verbose') { ++$verbose; }
|
cannam@95
|
261 elsif ($arglist[0] eq '-p') { ++$paranoid; }
|
cannam@95
|
262 elsif ($arglist[0] eq '--paranoid') { ++$paranoid; }
|
cannam@95
|
263 elsif ($arglist[0] eq '--exhaustive') { ++$exhaustive; }
|
cannam@95
|
264 elsif ($arglist[0] eq '--patient') { ++$patient; }
|
cannam@95
|
265 elsif ($arglist[0] eq '--estimate') { ++$estimate; }
|
cannam@95
|
266 elsif ($arglist[0] eq '--wisdom') { ++$wisdom; }
|
cannam@95
|
267 elsif ($arglist[0] =~ /^--nthreads=(.+)$/) { $nthreads = $1; }
|
cannam@95
|
268 elsif ($arglist[0] eq '-k') { ++$keepgoing; }
|
cannam@95
|
269 elsif ($arglist[0] eq '--keep-going') { ++$keepgoing; }
|
cannam@95
|
270 elsif ($arglist[0] =~ /^--verify-rounds=(.+)$/) { $rounds = $1; }
|
cannam@95
|
271 elsif ($arglist[0] =~ /^--count=(.+)$/) { $maxcount = $1; }
|
cannam@95
|
272 elsif ($arglist[0] =~ /^-c=(.+)$/) { $maxcount = $1; }
|
cannam@95
|
273 elsif ($arglist[0] =~ /^--flushcount=(.+)$/) { $flushcount = $1; }
|
cannam@95
|
274 elsif ($arglist[0] =~ /^--maxsize=(.+)$/) { $maxsize = $1; }
|
cannam@95
|
275
|
cannam@95
|
276 elsif ($arglist[0] eq '--mpi') { ++$mpi; }
|
cannam@95
|
277 elsif ($arglist[0] eq '--mpi-transposed-in') {
|
cannam@95
|
278 ++$mpi; ++$mpi_transposed_in; }
|
cannam@95
|
279 elsif ($arglist[0] eq '--mpi-transposed-out') {
|
cannam@95
|
280 ++$mpi; ++$mpi_transposed_out; }
|
cannam@95
|
281
|
cannam@95
|
282 elsif ($arglist[0] eq '-0d') { ++$do_0d; }
|
cannam@95
|
283 elsif ($arglist[0] eq '-1d') { ++$do_1d; }
|
cannam@95
|
284 elsif ($arglist[0] eq '-2d') { ++$do_2d; }
|
cannam@95
|
285 elsif ($arglist[0] eq '-r') { ++$do_random; }
|
cannam@95
|
286 elsif ($arglist[0] eq '--random') { ++$do_random; }
|
cannam@95
|
287 elsif ($arglist[0] eq '-a') {
|
cannam@95
|
288 ++$do_0d; ++$do_1d; ++$do_2d; ++$do_random;
|
cannam@95
|
289 }
|
cannam@95
|
290
|
cannam@95
|
291 else { $program=$arglist[0]; }
|
cannam@95
|
292 shift (@arglist);
|
cannam@95
|
293 }
|
cannam@95
|
294 }
|
cannam@95
|
295
|
cannam@95
|
296 # MAIN PROGRAM:
|
cannam@95
|
297
|
cannam@95
|
298 &parse_arguments (@ARGV);
|
cannam@95
|
299
|
cannam@95
|
300 &random_tests if $do_random;
|
cannam@95
|
301 &small_0d if $do_0d;
|
cannam@95
|
302 &small_1d if $do_1d;
|
cannam@95
|
303 &small_2d if $do_2d;
|
cannam@95
|
304
|
cannam@95
|
305 {
|
cannam@95
|
306 my $options = &make_options;
|
cannam@95
|
307 &flush_problems($options);
|
cannam@95
|
308 }
|