annotate src/fftw-3.3.3/tests/check.pl @ 83:ae30d91d2ffe

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