| sl@0 |      1 | /*
 | 
| sl@0 |      2 |  * LIBOIL - Library of Optimized Inner Loops
 | 
| sl@0 |      3 |  * Copyright (c) 2004 David A. Schleef <ds@schleef.org>
 | 
| sl@0 |      4 |  * All rights reserved.
 | 
| sl@0 |      5 |  *
 | 
| sl@0 |      6 |  * Redistribution and use in source and binary forms, with or without
 | 
| sl@0 |      7 |  * modification, are permitted provided that the following conditions
 | 
| sl@0 |      8 |  * are met:
 | 
| sl@0 |      9 |  * 1. Redistributions of source code must retain the above copyright
 | 
| sl@0 |     10 |  *    notice, this list of conditions and the following disclaimer.
 | 
| sl@0 |     11 |  * 2. Redistributions in binary form must reproduce the above copyright
 | 
| sl@0 |     12 |  *    notice, this list of conditions and the following disclaimer in the
 | 
| sl@0 |     13 |  *    documentation and/or other materials provided with the distribution.
 | 
| sl@0 |     14 |  * 
 | 
| sl@0 |     15 |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 | 
| sl@0 |     16 |  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
| sl@0 |     17 |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
| sl@0 |     18 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 | 
| sl@0 |     19 |  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
| sl@0 |     20 |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
| sl@0 |     21 |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
| sl@0 |     22 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 | 
| sl@0 |     23 |  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 | 
| sl@0 |     24 |  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
| sl@0 |     25 |  * POSSIBILITY OF SUCH DAMAGE.
 | 
| sl@0 |     26 |  */
 | 
| sl@0 |     27 | 
 | 
| sl@0 |     28 | #ifdef HAVE_CONFIG_H
 | 
| sl@0 |     29 | #include "config.h"
 | 
| sl@0 |     30 | #endif
 | 
| sl@0 |     31 | 
 | 
| sl@0 |     32 | #include <liboil/liboil.h>
 | 
| sl@0 |     33 | #include <liboil/liboilfunction.h>
 | 
| sl@0 |     34 | #include <liboil/liboilcpu.h>
 | 
| sl@0 |     35 | #include <liboil/liboiltest.h>
 | 
| sl@0 |     36 | 
 | 
| sl@0 |     37 | #include <stdio.h>
 | 
| sl@0 |     38 | #include <stdlib.h>
 | 
| sl@0 |     39 | #include <string.h>
 | 
| sl@0 |     40 | #include <stdarg.h>
 | 
| sl@0 |     41 | #define LOG_FILE "c:\\logs\\examples_oil-suggest_log.txt"
 | 
| sl@0 |     42 | #include "std_log_result.h"
 | 
| sl@0 |     43 | #define LOG_FILENAME_LINE __FILE__, __LINE__
 | 
| sl@0 |     44 | 
 | 
| sl@0 |     45 | void create_xml(int result)
 | 
| sl@0 |     46 | {
 | 
| sl@0 |     47 |     if(result)
 | 
| sl@0 |     48 |         assert_failed = 1;
 | 
| sl@0 |     49 |     
 | 
| sl@0 |     50 |     testResultXml("examples_oil-suggest");
 | 
| sl@0 |     51 |     close_log_file();
 | 
| sl@0 |     52 | }
 | 
| sl@0 |     53 | 
 | 
| sl@0 |     54 | static int
 | 
| sl@0 |     55 | is_poorly_strided (OilFunctionClass *klass)
 | 
| sl@0 |     56 | {
 | 
| sl@0 |     57 |   OilPrototype *proto;
 | 
| sl@0 |     58 |   int i;
 | 
| sl@0 |     59 |   int j;
 | 
| sl@0 |     60 |   OilParameter *param;
 | 
| sl@0 |     61 | 
 | 
| sl@0 |     62 |   proto = oil_prototype_from_string (klass->prototype);
 | 
| sl@0 |     63 |   for(i=0;i<proto->n_params;i++) {
 | 
| sl@0 |     64 |     if (proto->params[i].is_stride) {
 | 
| sl@0 |     65 |       for(j=0;j<proto->n_params;j++) {
 | 
| sl@0 |     66 |         param = proto->params + j;
 | 
| sl@0 |     67 |         if (param->parameter_type == (proto->params[i].parameter_type - 1)) {
 | 
| sl@0 |     68 |           if (param->prestride_length == 1 && param->poststride_length == 0) {
 | 
| sl@0 |     69 |             oil_prototype_free (proto);
 | 
| sl@0 |     70 |             return 1;
 | 
| sl@0 |     71 |           }
 | 
| sl@0 |     72 |         }
 | 
| sl@0 |     73 |       }
 | 
| sl@0 |     74 |     }
 | 
| sl@0 |     75 |   }
 | 
| sl@0 |     76 |   oil_prototype_free (proto);
 | 
| sl@0 |     77 |   return 0;
 | 
| sl@0 |     78 | }
 | 
| sl@0 |     79 | 
 | 
| sl@0 |     80 | static double
 | 
| sl@0 |     81 | get_speed_score (OilFunctionClass *klass)
 | 
| sl@0 |     82 | {
 | 
| sl@0 |     83 |   OilFunctionImpl *impl;
 | 
| sl@0 |     84 |   double max;
 | 
| sl@0 |     85 |   double x;
 | 
| sl@0 |     86 | 
 | 
| sl@0 |     87 |   max = 1.0;
 | 
| sl@0 |     88 |   for(impl = klass->first_impl; impl; impl = impl->next) {
 | 
| sl@0 |     89 |     x =  klass->reference_impl->profile_ave / impl->profile_ave;
 | 
| sl@0 |     90 |     if (x > max) max = x;
 | 
| sl@0 |     91 |   }
 | 
| sl@0 |     92 |   return max;
 | 
| sl@0 |     93 | }
 | 
| sl@0 |     94 | 
 | 
| sl@0 |     95 | static void
 | 
| sl@0 |     96 | oil_suggest_class (OilFunctionClass *klass, int verbose)
 | 
| sl@0 |     97 | {
 | 
| sl@0 |     98 |   double x;
 | 
| sl@0 |     99 | 
 | 
| sl@0 |    100 |   if (is_poorly_strided (klass)) return;
 | 
| sl@0 |    101 | 
 | 
| sl@0 |    102 |   x = get_speed_score (klass);
 | 
| sl@0 |    103 | 
 | 
| sl@0 |    104 |   if (x < 20.0) {
 | 
| sl@0 |    105 |   std_log(LOG_FILENAME_LINE,"%s %g\n", klass->name, x);
 | 
| sl@0 |    106 |   }
 | 
| sl@0 |    107 | }
 | 
| sl@0 |    108 | 
 | 
| sl@0 |    109 | static void
 | 
| sl@0 |    110 | oil_suggest_all (void)
 | 
| sl@0 |    111 | {
 | 
| sl@0 |    112 |   int i;
 | 
| sl@0 |    113 |   int n;
 | 
| sl@0 |    114 | 
 | 
| sl@0 |    115 |   n = oil_class_get_n_classes ();
 | 
| sl@0 |    116 |   for (i = 0; i < n; i++){
 | 
| sl@0 |    117 |     OilFunctionClass *klass = oil_class_get_by_index (i);
 | 
| sl@0 |    118 | 
 | 
| sl@0 |    119 |     oil_suggest_class (klass, 0);
 | 
| sl@0 |    120 |   }
 | 
| sl@0 |    121 | }
 | 
| sl@0 |    122 | 
 | 
| sl@0 |    123 | static void
 | 
| sl@0 |    124 | oil_suggest (const char *s)
 | 
| sl@0 |    125 | {
 | 
| sl@0 |    126 |   OilFunctionClass *klass = oil_class_get (s);
 | 
| sl@0 |    127 | 
 | 
| sl@0 |    128 |   if (klass) {
 | 
| sl@0 |    129 |     oil_suggest_class (klass, 0);
 | 
| sl@0 |    130 |   }
 | 
| sl@0 |    131 | }
 | 
| sl@0 |    132 | 
 | 
| sl@0 |    133 | int
 | 
| sl@0 |    134 | main (int argc, char *argv[])
 | 
| sl@0 |    135 | {
 | 
| sl@0 |    136 |   int i;
 | 
| sl@0 |    137 | 
 | 
| sl@0 |    138 |   oil_init();
 | 
| sl@0 |    139 | 
 | 
| sl@0 |    140 |   if (argc == 1) {
 | 
| sl@0 |    141 |     oil_suggest_all ();
 | 
| sl@0 |    142 | 	create_xml(0);
 | 
| sl@0 |    143 |     return 0;
 | 
| sl@0 |    144 |   }
 | 
| sl@0 |    145 | 
 | 
| sl@0 |    146 |   for(i=1;i<argc;i++){
 | 
| sl@0 |    147 |     oil_suggest (argv[i]);
 | 
| sl@0 |    148 |   }
 | 
| sl@0 |    149 |     if(assert_failed)
 | 
| sl@0 |    150 |           std_log(LOG_FILENAME_LINE,"Test Fail");
 | 
| sl@0 |    151 |     else
 | 
| sl@0 |    152 |           std_log(LOG_FILENAME_LINE,"Test Successful");
 | 
| sl@0 |    153 |     create_xml(0);
 | 
| sl@0 |    154 |     return 0;
 | 
| sl@0 |    155 | }
 | 
| sl@0 |    156 | 
 |