| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/cpu.h" | |
| 6 #include "base/memory/aligned_memory.h" | 5 #include "base/memory/aligned_memory.h" |
| 7 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/time/time.h" | 7 #include "base/time/time.h" |
| 9 #include "media/base/vector_math.h" | 8 #include "media/base/vector_math.h" |
| 10 #include "media/base/vector_math_testing.h" | 9 #include "media/base/vector_math_testing.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include "testing/perf/perf_test.h" | 11 #include "testing/perf/perf_test.h" |
| 13 | 12 |
| 14 using base::TimeTicks; | 13 using base::TimeTicks; |
| 15 using std::fill; | 14 using std::fill; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 true); | 72 true); |
| 74 } | 73 } |
| 75 | 74 |
| 76 protected: | 75 protected: |
| 77 scoped_ptr<float, base::AlignedFreeDeleter> input_vector_; | 76 scoped_ptr<float, base::AlignedFreeDeleter> input_vector_; |
| 78 scoped_ptr<float, base::AlignedFreeDeleter> output_vector_; | 77 scoped_ptr<float, base::AlignedFreeDeleter> output_vector_; |
| 79 | 78 |
| 80 DISALLOW_COPY_AND_ASSIGN(VectorMathPerfTest); | 79 DISALLOW_COPY_AND_ASSIGN(VectorMathPerfTest); |
| 81 }; | 80 }; |
| 82 | 81 |
| 83 // Define platform independent function name for FMAC* perf tests. | 82 // Define platform dependent function names for SIMD optimized methods. |
| 84 #if defined(ARCH_CPU_X86_FAMILY) | 83 #if defined(ARCH_CPU_X86_FAMILY) |
| 85 #define FMAC_FUNC FMAC_SSE | 84 #define FMAC_FUNC FMAC_SSE |
| 85 #define FMUL_FUNC FMUL_SSE |
| 86 #define EWMAAndMaxPower_FUNC EWMAAndMaxPower_SSE |
| 86 #elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON) | 87 #elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON) |
| 87 #define FMAC_FUNC FMAC_NEON | 88 #define FMAC_FUNC FMAC_NEON |
| 89 #define FMUL_FUNC FMUL_NEON |
| 90 #define EWMAAndMaxPower_FUNC EWMAAndMaxPower_NEON |
| 88 #endif | 91 #endif |
| 89 | 92 |
| 90 // Benchmark for each optimized vector_math::FMAC() method. | 93 // Benchmark for each optimized vector_math::FMAC() method. |
| 91 TEST_F(VectorMathPerfTest, FMAC) { | 94 TEST_F(VectorMathPerfTest, FMAC) { |
| 92 // Benchmark FMAC_C(). | 95 // Benchmark FMAC_C(). |
| 93 RunBenchmark( | 96 RunBenchmark( |
| 94 vector_math::FMAC_C, true, "vector_math_fmac", "unoptimized"); | 97 vector_math::FMAC_C, true, "vector_math_fmac", "unoptimized"); |
| 95 #if defined(FMAC_FUNC) | 98 #if defined(FMAC_FUNC) |
| 96 #if defined(ARCH_CPU_X86_FAMILY) | |
| 97 ASSERT_TRUE(base::CPU().has_sse()); | |
| 98 #endif | |
| 99 // Benchmark FMAC_FUNC() with unaligned size. | 99 // Benchmark FMAC_FUNC() with unaligned size. |
| 100 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / | 100 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / |
| 101 sizeof(float)), 0U); | 101 sizeof(float)), 0U); |
| 102 RunBenchmark( | 102 RunBenchmark( |
| 103 vector_math::FMAC_FUNC, false, "vector_math_fmac", "optimized_unaligned"); | 103 vector_math::FMAC_FUNC, false, "vector_math_fmac", "optimized_unaligned"); |
| 104 // Benchmark FMAC_FUNC() with aligned size. | 104 // Benchmark FMAC_FUNC() with aligned size. |
| 105 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), | 105 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), |
| 106 0U); | 106 0U); |
| 107 RunBenchmark( | 107 RunBenchmark( |
| 108 vector_math::FMAC_FUNC, true, "vector_math_fmac", "optimized_aligned"); | 108 vector_math::FMAC_FUNC, true, "vector_math_fmac", "optimized_aligned"); |
| 109 #endif | 109 #endif |
| 110 } | 110 } |
| 111 | 111 |
| 112 #undef FMAC_FUNC | |
| 113 | |
| 114 // Define platform independent function name for FMULBenchmark* tests. | |
| 115 #if defined(ARCH_CPU_X86_FAMILY) | |
| 116 #define FMUL_FUNC FMUL_SSE | |
| 117 #elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON) | |
| 118 #define FMUL_FUNC FMUL_NEON | |
| 119 #endif | |
| 120 | |
| 121 // Benchmark for each optimized vector_math::FMUL() method. | 112 // Benchmark for each optimized vector_math::FMUL() method. |
| 122 TEST_F(VectorMathPerfTest, FMUL) { | 113 TEST_F(VectorMathPerfTest, FMUL) { |
| 123 // Benchmark FMUL_C(). | 114 // Benchmark FMUL_C(). |
| 124 RunBenchmark( | 115 RunBenchmark( |
| 125 vector_math::FMUL_C, true, "vector_math_fmul", "unoptimized"); | 116 vector_math::FMUL_C, true, "vector_math_fmul", "unoptimized"); |
| 126 #if defined(FMUL_FUNC) | 117 #if defined(FMUL_FUNC) |
| 127 #if defined(ARCH_CPU_X86_FAMILY) | |
| 128 ASSERT_TRUE(base::CPU().has_sse()); | |
| 129 #endif | |
| 130 // Benchmark FMUL_FUNC() with unaligned size. | 118 // Benchmark FMUL_FUNC() with unaligned size. |
| 131 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / | 119 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / |
| 132 sizeof(float)), 0U); | 120 sizeof(float)), 0U); |
| 133 RunBenchmark( | 121 RunBenchmark( |
| 134 vector_math::FMUL_FUNC, false, "vector_math_fmul", "optimized_unaligned"); | 122 vector_math::FMUL_FUNC, false, "vector_math_fmul", "optimized_unaligned"); |
| 135 // Benchmark FMUL_FUNC() with aligned size. | 123 // Benchmark FMUL_FUNC() with aligned size. |
| 136 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), | 124 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), |
| 137 0U); | 125 0U); |
| 138 RunBenchmark( | 126 RunBenchmark( |
| 139 vector_math::FMUL_FUNC, true, "vector_math_fmul", "optimized_aligned"); | 127 vector_math::FMUL_FUNC, true, "vector_math_fmul", "optimized_aligned"); |
| 140 #endif | 128 #endif |
| 141 } | 129 } |
| 142 | 130 |
| 143 #undef FMUL_FUNC | |
| 144 | |
| 145 #if defined(ARCH_CPU_X86_FAMILY) | |
| 146 #define EWMAAndMaxPower_FUNC EWMAAndMaxPower_SSE | |
| 147 #elif defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON) | |
| 148 #define EWMAAndMaxPower_FUNC EWMAAndMaxPower_NEON | |
| 149 #endif | |
| 150 | |
| 151 // Benchmark for each optimized vector_math::EWMAAndMaxPower() method. | 131 // Benchmark for each optimized vector_math::EWMAAndMaxPower() method. |
| 152 TEST_F(VectorMathPerfTest, EWMAAndMaxPower) { | 132 TEST_F(VectorMathPerfTest, EWMAAndMaxPower) { |
| 153 // Benchmark EWMAAndMaxPower_C(). | 133 // Benchmark EWMAAndMaxPower_C(). |
| 154 RunBenchmark(vector_math::EWMAAndMaxPower_C, | 134 RunBenchmark(vector_math::EWMAAndMaxPower_C, |
| 155 kVectorSize, | 135 kVectorSize, |
| 156 "vector_math_ewma_and_max_power", | 136 "vector_math_ewma_and_max_power", |
| 157 "unoptimized"); | 137 "unoptimized"); |
| 158 #if defined(EWMAAndMaxPower_FUNC) | 138 #if defined(EWMAAndMaxPower_FUNC) |
| 159 #if defined(ARCH_CPU_X86_FAMILY) | |
| 160 ASSERT_TRUE(base::CPU().has_sse()); | |
| 161 #endif | |
| 162 // Benchmark EWMAAndMaxPower_FUNC() with unaligned size. | 139 // Benchmark EWMAAndMaxPower_FUNC() with unaligned size. |
| 163 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / | 140 ASSERT_NE((kVectorSize - 1) % (vector_math::kRequiredAlignment / |
| 164 sizeof(float)), 0U); | 141 sizeof(float)), 0U); |
| 165 RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, | 142 RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, |
| 166 kVectorSize - 1, | 143 kVectorSize - 1, |
| 167 "vector_math_ewma_and_max_power", | 144 "vector_math_ewma_and_max_power", |
| 168 "optimized_unaligned"); | 145 "optimized_unaligned"); |
| 169 // Benchmark EWMAAndMaxPower_FUNC() with aligned size. | 146 // Benchmark EWMAAndMaxPower_FUNC() with aligned size. |
| 170 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), | 147 ASSERT_EQ(kVectorSize % (vector_math::kRequiredAlignment / sizeof(float)), |
| 171 0U); | 148 0U); |
| 172 RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, | 149 RunBenchmark(vector_math::EWMAAndMaxPower_FUNC, |
| 173 kVectorSize, | 150 kVectorSize, |
| 174 "vector_math_ewma_and_max_power", | 151 "vector_math_ewma_and_max_power", |
| 175 "optimized_aligned"); | 152 "optimized_aligned"); |
| 176 #endif | 153 #endif |
| 177 } | 154 } |
| 178 | 155 |
| 179 #undef EWMAAndMaxPower_FUNC | |
| 180 | |
| 181 } // namespace media | 156 } // namespace media |
| OLD | NEW |