Update tizen 2.0 beta source
[profile/ivi/liboil.git] / testsuite / stride.c
1 /*
2  * LIBOIL - Library of Optimized Inner Loops
3  * Copyright (c) 2004 David A. Schleef <ds@schleef.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27
28
29 #include <stdio.h>
30 #include <liboil/liboil.h>
31 #include <ctype.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <math.h>
35
36 #include <liboil/liboilprototype.h>
37 #include <liboil/liboiltest.h>
38 #include <liboil/liboilcpu.h>
39 #include <liboil/liboilrandom.h>
40
41 void hist(OilTest *Test);
42
43 int verbose = 0;
44 int fail = 0;
45
46 int main (int argc, char *argv[])
47 {
48   OilFunctionClass *klass;
49   OilFunctionImpl *impl;
50   OilTest *test;
51   int i;
52   int n;
53   int j;
54   int ret;
55   unsigned int cpu_flags;
56
57   if (argc > 1 && strcmp(argv[1],"-v") == 0) {
58     verbose = 1;
59   }
60
61   oil_init ();
62
63   cpu_flags = oil_cpu_get_flags ();
64   n = oil_class_get_n_classes ();
65   for (i=0;i<n; i++ ){
66     klass = oil_class_get_by_index(i);
67
68     printf("%s\n", klass->name);
69
70     test = oil_test_new (klass);
71     if (test == NULL) {
72       printf("class \"%s\" has  bad prototype\n", klass->name);
73       fail = 1;
74       continue;
75     }
76     oil_test_set_iterations (test, 1);
77     test->n = 1 + oil_rand_u8();
78     test->m = 1 + oil_rand_u8();
79
80     oil_test_check_impl (test, klass->reference_impl);
81     for(j=0;j<OIL_ARG_LAST;j++){
82       if (test->params[j].is_stride) {
83         test->params[j].value += oil_type_sizeof(test->params[j].type) *
84           (oil_rand_u8()&0xf);
85       }
86     }
87     test->inited = 0;
88
89     for (impl = klass->first_impl; impl; impl = impl->next) {
90       printf("  %s\n", impl->name);
91       if ((impl->flags & OIL_CPU_FLAG_MASK) & ~cpu_flags) {
92         printf("    not supported\n");
93       } else {
94         ret = oil_test_check_impl (test, impl);
95         if (!ret) {
96           printf("    failed stride test\n");
97           fail = 1;
98         }
99 #if 0
100           printf("    %lu %g\n",test->prof.min,
101               (double)test->prof.total/test->prof.n);
102           for(j=0;j<test->prof.hist_n;j++){
103             printf("    %lu %d\n",test->prof.hist_time[j],test->prof.hist_count[j]);
104           }
105           printf("    ave=%g std=%g\n", impl->profile_ave, impl->profile_std);
106           //hist(test);
107 #endif
108       }
109     }
110
111     oil_test_free (test);
112   }
113
114   return fail;
115 }
116
117
118 void
119 hist(OilTest *test)
120 {
121   double ave;
122   double std;
123   int max_i;
124   double off;
125   double s;
126   double s2;
127   int i;
128   int n;
129   double x;
130
131   do {
132     s = s2 = 0;
133     n = 0;
134     max_i = -1;
135     for(i=0;i<10;i++){
136       x = test->prof.hist_time[i];
137       s2 += x * x * test->prof.hist_count[i];
138       s += x * test->prof.hist_count[i];
139       n += test->prof.hist_count[i];
140       if (test->prof.hist_count[i] > 0) {
141         if (max_i == -1 || test->prof.hist_time[i] > test->prof.hist_time[max_i]) {
142           max_i = i;
143         }
144       }
145     }
146
147     ave = s / n;
148     std = sqrt (s2 - s * s / n + n*n) / (n-1);
149     off = (test->prof.hist_time[max_i] - ave)/std;
150
151     printf("    ave=%g std=%g max=%ld off=%g %s\n",
152         ave, std, test->prof.hist_time[max_i], off, (off>4.0)?"yes":"no");
153
154     if (off > 4.0) {
155       test->prof.hist_count[max_i] = 0;
156     }
157   } while (off > 4.0);
158   printf("    ave=%g std=%g\n", ave, std);
159 }
160
161