| 1829 | |
| 1830 | template <typename LhsScalar, typename RhsScalar, typename SpecType> |
| 1831 | void TestSet<LhsScalar, RhsScalar, SpecType>::Benchmark( |
| 1832 | TestResult<typename SpecType::DstScalar>* result) { |
| 1833 | using DstScalar = typename SpecType::DstScalar; |
| 1834 | |
| 1835 | const bool cold = getenv("RUY_BENCHMARK_COLD"); |
| 1836 | LhsScalar* orig_lhs_data = lhs.matrix.data.get(); |
| 1837 | RhsScalar* orig_rhs_data = rhs.matrix.data.get(); |
| 1838 | DstScalar* orig_dst_data = result->storage_matrix.matrix.data.get(); |
| 1839 | void* orig_prepacked_lhs_data = result->prepacked_lhs.data; |
| 1840 | void* orig_prepacked_rhs_data = result->prepacked_rhs.data; |
| 1841 | |
| 1842 | int num_matmul_sets = 0; |
| 1843 | |
| 1844 | RepeatedBuffer<LhsScalar> cold_lhs; |
| 1845 | RepeatedBuffer<RhsScalar> cold_rhs; |
| 1846 | RepeatedBuffer<DstScalar> cold_dst; |
| 1847 | RepeatedBuffer<char> cold_prepacked_lhs; |
| 1848 | RepeatedBuffer<char> cold_prepacked_rhs; |
| 1849 | |
| 1850 | if (cold) { |
| 1851 | const int kWorkingSetSize = 100 << 20; |
| 1852 | const int each_matmul_set_size = StorageSize(lhs.matrix) + |
| 1853 | StorageSize(rhs.matrix) + |
| 1854 | StorageSize(result->storage_matrix.matrix); |
| 1855 | num_matmul_sets = |
| 1856 | (kWorkingSetSize + each_matmul_set_size - 1) / each_matmul_set_size; |
| 1857 | |
| 1858 | cold_lhs.Init(lhs.matrix.data.get(), FlatSize(lhs.matrix.layout), |
| 1859 | num_matmul_sets); |
| 1860 | cold_rhs.Init(rhs.matrix.data.get(), FlatSize(rhs.matrix.layout), |
| 1861 | num_matmul_sets); |
| 1862 | cold_dst.Init(result->storage_matrix.matrix.data.get(), |
| 1863 | FlatSize(result->storage_matrix.matrix.layout), |
| 1864 | num_matmul_sets); |
| 1865 | if (benchmark_prepack_lhs) { |
| 1866 | cold_prepacked_lhs.Init(static_cast<char*>(result->prepacked_lhs.data), |
| 1867 | result->prepacked_lhs.data_size, num_matmul_sets); |
| 1868 | } |
| 1869 | if (benchmark_prepack_rhs) { |
| 1870 | cold_prepacked_rhs.Init(static_cast<char*>(result->prepacked_rhs.data), |
| 1871 | result->prepacked_rhs.data_size, num_matmul_sets); |
| 1872 | } |
| 1873 | } |
| 1874 | const bool record_pmu = GetBoolEnvVarOrFalse("RUY_BENCHMARK_PMU"); |
| 1875 | int repeats = GetIntEnvVarOrZero("RUY_BENCHMARK_REPEATS"); |
| 1876 | if (!repeats) { |
| 1877 | repeats = 4; |
| 1878 | } |
| 1879 | float benchmark_min_secs = GetFloatEnvVarOrZero("RUY_BENCHMARK_MIN_SECS"); |
| 1880 | if (!benchmark_min_secs) { |
| 1881 | benchmark_min_secs = 0.5; |
| 1882 | } |
| 1883 | #ifdef GEMMLOWP_PROFILING |
| 1884 | const char* lhstype = TypeName<LhsScalar>(); |
| 1885 | const char* lhssymm = SymmetryName(lhs.matrix); |
| 1886 | const char* rhstype = TypeName<RhsScalar>(); |
| 1887 | const char* rhssymm = SymmetryName(rhs.matrix); |
| 1888 |
nothing calls this directly
no test coverage detected