OLD | NEW |
1 #include "SkBenchmark.h" | 1 #include "SkBenchmark.h" |
2 #include "SkColorPriv.h" | 2 #include "SkColorPriv.h" |
3 #include "SkMatrix.h" | 3 #include "SkMatrix.h" |
4 #include "SkRandom.h" | 4 #include "SkRandom.h" |
5 #include "SkString.h" | 5 #include "SkString.h" |
6 #include "SkPaint.h" | 6 #include "SkPaint.h" |
7 | 7 |
8 static float sk_fsel(float pred, float result_ge, float result_lt) { | 8 static float sk_fsel(float pred, float result_ge, float result_lt) { |
9 return pred >= 0 ? result_ge : result_lt; | 9 return pred >= 0 ? result_ge : result_lt; |
10 } | 10 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 const float* SK_RESTRICT src, | 86 const float* SK_RESTRICT src, |
87 int count) { | 87 int count) { |
88 for (int i = 0; i < count; ++i) { | 88 for (int i = 0; i < count; ++i) { |
89 dst[i] = src[i] + 1; | 89 dst[i] = src[i] + 1; |
90 } | 90 } |
91 } | 91 } |
92 private: | 92 private: |
93 typedef MathBench INHERITED; | 93 typedef MathBench INHERITED; |
94 }; | 94 }; |
95 | 95 |
96 class SlowISqrtMathBench : public MathBench { | 96 class InvSqrtBench : public SkBenchmark { |
| 97 enum { |
| 98 ARRAY = SkBENCHLOOP(1000), |
| 99 LOOP = SkBENCHLOOP(5000), |
| 100 }; |
| 101 float fData[ARRAY]; |
| 102 const char *type; |
| 103 |
97 public: | 104 public: |
98 SlowISqrtMathBench(void* param) : INHERITED(param, "slowIsqrt") {} | 105 InvSqrtBench(void* param, const char *type) |
| 106 : INHERITED(param) |
| 107 , type(type) { |
| 108 } |
| 109 |
| 110 // just so the compiler doesn't remove our loops |
| 111 virtual void process(int) {} |
| 112 |
99 protected: | 113 protected: |
100 virtual void performTest(float* SK_RESTRICT dst, | 114 virtual void onPreDraw() SK_OVERRIDE { |
101 const float* SK_RESTRICT src, | 115 SkRandom rand; |
102 int count) { | 116 for (int i = 0; i < ARRAY; ++i) { |
103 for (int i = 0; i < count; ++i) { | 117 fData[i] = rand.nextRangeF(0, 10000); |
104 dst[i] = 1.0f / sk_float_sqrt(src[i]); | |
105 } | 118 } |
| 119 |
| 120 fIsRendering = false; |
106 } | 121 } |
| 122 |
| 123 virtual void onDraw(SkCanvas*) { |
| 124 float accum = 0; |
| 125 |
| 126 if (strcmp(type, "float_slow") == 0) { |
| 127 for (int j = 0; j < LOOP; ++j) |
| 128 for (int i = 0; i < ARRAY; ++i) |
| 129 accum += 1.0f / sk_float_sqrt(fData[i]); |
| 130 } else if (strcmp(type, "float_fast") == 0) { |
| 131 for (int j = 0; j < LOOP; ++j) |
| 132 for (int i = 0; i < ARRAY; ++i) |
| 133 accum += SkFloatInvSqrt(fData[i]); |
| 134 } |
| 135 |
| 136 this->process(accum); |
| 137 } |
| 138 |
| 139 virtual const char* onGetName() { |
| 140 fName.printf("math_inv_sqrt"); |
| 141 fName.appendf("_%s", type); |
| 142 return fName.c_str(); |
| 143 } |
| 144 |
107 private: | 145 private: |
108 typedef MathBench INHERITED; | 146 SkString fName; |
109 }; | 147 typedef SkBenchmark INHERITED; |
110 | |
111 static inline float SkFastInvSqrt(float x) { | |
112 float xhalf = 0.5f*x; | |
113 int i = *SkTCast<int*>(&x); | |
114 i = 0x5f3759df - (i>>1); | |
115 x = *SkTCast<float*>(&i); | |
116 x = x*(1.5f-xhalf*x*x); | |
117 // x = x*(1.5f-xhalf*x*x); // this line takes err from 10^-3 to 10^-6 | |
118 return x; | |
119 } | |
120 | |
121 class FastISqrtMathBench : public MathBench { | |
122 public: | |
123 FastISqrtMathBench(void* param) : INHERITED(param, "fastIsqrt") {} | |
124 protected: | |
125 virtual void performTest(float* SK_RESTRICT dst, | |
126 const float* SK_RESTRICT src, | |
127 int count) { | |
128 for (int i = 0; i < count; ++i) { | |
129 dst[i] = SkFastInvSqrt(src[i]); | |
130 } | |
131 } | |
132 private: | |
133 typedef MathBench INHERITED; | |
134 }; | 148 }; |
135 | 149 |
136 static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { | 150 static inline uint32_t QMul64(uint32_t value, U8CPU alpha) { |
137 SkASSERT((uint8_t)alpha == alpha); | 151 SkASSERT((uint8_t)alpha == alpha); |
138 const uint32_t mask = 0xFF00FF; | 152 const uint32_t mask = 0xFF00FF; |
139 | 153 |
140 uint64_t tmp = value; | 154 uint64_t tmp = value; |
141 tmp = (tmp & mask) | ((tmp & ~mask) << 24); | 155 tmp = (tmp & mask) | ((tmp & ~mask) << 24); |
142 tmp *= alpha; | 156 tmp *= alpha; |
143 return (uint32_t) (((tmp >> 8) & mask) | ((tmp >> 32) & ~mask)); | 157 return (uint32_t) (((tmp >> 8) & mask) | ((tmp >> 32) & ~mask)); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 return "float_to_fixed"; | 530 return "float_to_fixed"; |
517 } | 531 } |
518 | 532 |
519 private: | 533 private: |
520 typedef SkBenchmark INHERITED; | 534 typedef SkBenchmark INHERITED; |
521 }; | 535 }; |
522 | 536 |
523 /////////////////////////////////////////////////////////////////////////////// | 537 /////////////////////////////////////////////////////////////////////////////// |
524 | 538 |
525 DEF_BENCH( return new NoOpMathBench(p); ) | 539 DEF_BENCH( return new NoOpMathBench(p); ) |
526 DEF_BENCH( return new SlowISqrtMathBench(p); ) | 540 DEF_BENCH( return new InvSqrtBench(p, "float_slow"); ) |
527 DEF_BENCH( return new FastISqrtMathBench(p); ) | 541 DEF_BENCH( return new InvSqrtBench(p, "float_fast"); ) |
528 DEF_BENCH( return new QMul64Bench(p); ) | 542 DEF_BENCH( return new QMul64Bench(p); ) |
529 DEF_BENCH( return new QMul32Bench(p); ) | 543 DEF_BENCH( return new QMul32Bench(p); ) |
530 | 544 |
531 DEF_BENCH( return new IsFiniteBench(p, -1); ) | 545 DEF_BENCH( return new IsFiniteBench(p, -1); ) |
532 DEF_BENCH( return new IsFiniteBench(p, 0); ) | 546 DEF_BENCH( return new IsFiniteBench(p, 0); ) |
533 DEF_BENCH( return new IsFiniteBench(p, 1); ) | 547 DEF_BENCH( return new IsFiniteBench(p, 1); ) |
534 DEF_BENCH( return new IsFiniteBench(p, 2); ) | 548 DEF_BENCH( return new IsFiniteBench(p, 2); ) |
535 DEF_BENCH( return new IsFiniteBench(p, 3); ) | 549 DEF_BENCH( return new IsFiniteBench(p, 3); ) |
536 DEF_BENCH( return new IsFiniteBench(p, 4); ) | 550 DEF_BENCH( return new IsFiniteBench(p, 4); ) |
537 DEF_BENCH( return new IsFiniteBench(p, 5); ) | 551 DEF_BENCH( return new IsFiniteBench(p, 5); ) |
538 | 552 |
539 DEF_BENCH( return new FloorBench(p, false); ) | 553 DEF_BENCH( return new FloorBench(p, false); ) |
540 DEF_BENCH( return new FloorBench(p, true); ) | 554 DEF_BENCH( return new FloorBench(p, true); ) |
541 | 555 |
542 DEF_BENCH( return new CLZBench(p, false); ) | 556 DEF_BENCH( return new CLZBench(p, false); ) |
543 DEF_BENCH( return new CLZBench(p, true); ) | 557 DEF_BENCH( return new CLZBench(p, true); ) |
544 | 558 |
545 DEF_BENCH( return new NormalizeBench(p); ) | 559 DEF_BENCH( return new NormalizeBench(p); ) |
546 | 560 |
547 DEF_BENCH( return new FixedMathBench(p); ) | 561 DEF_BENCH( return new FixedMathBench(p); ) |
OLD | NEW |