| cannam@167 | 1 /* | 
| cannam@167 | 2  * Copyright (c) 2003, 2007-14 Matteo Frigo | 
| cannam@167 | 3  * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology | 
| cannam@167 | 4  * | 
| cannam@167 | 5  * This program is free software; you can redistribute it and/or modify | 
| cannam@167 | 6  * it under the terms of the GNU General Public License as published by | 
| cannam@167 | 7  * the Free Software Foundation; either version 2 of the License, or | 
| cannam@167 | 8  * (at your option) any later version. | 
| cannam@167 | 9  * | 
| cannam@167 | 10  * This program is distributed in the hope that it will be useful, | 
| cannam@167 | 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| cannam@167 | 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| cannam@167 | 13  * GNU General Public License for more details. | 
| cannam@167 | 14  * | 
| cannam@167 | 15  * You should have received a copy of the GNU General Public License | 
| cannam@167 | 16  * along with this program; if not, write to the Free Software | 
| cannam@167 | 17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
| cannam@167 | 18  * | 
| cannam@167 | 19  */ | 
| cannam@167 | 20 | 
| cannam@167 | 21 | 
| cannam@167 | 22 #include "verify.h" | 
| cannam@167 | 23 | 
| cannam@167 | 24 static void recur(int rnk, const bench_iodim *dims0, const bench_iodim *dims1, | 
| cannam@167 | 25 		  dotens2_closure *k, | 
| cannam@167 | 26 		  int indx0, int ondx0, int indx1, int ondx1) | 
| cannam@167 | 27 { | 
| cannam@167 | 28      if (rnk == 0) | 
| cannam@167 | 29           k->apply(k, indx0, ondx0, indx1, ondx1); | 
| cannam@167 | 30      else { | 
| cannam@167 | 31           int i, n = dims0[0].n; | 
| cannam@167 | 32           int is0 = dims0[0].is; | 
| cannam@167 | 33           int os0 = dims0[0].os; | 
| cannam@167 | 34           int is1 = dims1[0].is; | 
| cannam@167 | 35           int os1 = dims1[0].os; | 
| cannam@167 | 36 | 
| cannam@167 | 37 	  BENCH_ASSERT(n == dims1[0].n); | 
| cannam@167 | 38 | 
| cannam@167 | 39           for (i = 0; i < n; ++i) { | 
| cannam@167 | 40                recur(rnk - 1, dims0 + 1, dims1 + 1, k, | 
| cannam@167 | 41 		     indx0, ondx0, indx1, ondx1); | 
| cannam@167 | 42 	       indx0 += is0; ondx0 += os0; | 
| cannam@167 | 43 	       indx1 += is1; ondx1 += os1; | 
| cannam@167 | 44 	  } | 
| cannam@167 | 45      } | 
| cannam@167 | 46 } | 
| cannam@167 | 47 | 
| cannam@167 | 48 void bench_dotens2(const bench_tensor *sz0, const bench_tensor *sz1, dotens2_closure *k) | 
| cannam@167 | 49 { | 
| cannam@167 | 50      BENCH_ASSERT(sz0->rnk == sz1->rnk); | 
| cannam@167 | 51      if (sz0->rnk == BENCH_RNK_MINFTY) | 
| cannam@167 | 52           return; | 
| cannam@167 | 53      recur(sz0->rnk, sz0->dims, sz1->dims, k, 0, 0, 0, 0); | 
| cannam@167 | 54 } |