diff options
author | Matthew Bentham <matthew.bentham@arm.com> | 2020-03-09 10:55:40 +0000 |
---|---|---|
committer | Michele Di Giorgio <michele.digiorgio@arm.com> | 2020-03-12 13:52:15 +0000 |
commit | 470bc1eea65560d13001e60a7f7b22b12ec89bbc (patch) | |
tree | a0bfae560f2871c7b4e1518b4c8d185f4e07442c /tests/AssetsLibrary.h | |
parent | a14817a7eee8b8cb7e5ccb6186ca01c23eec2629 (diff) | |
download | ComputeLibrary-470bc1eea65560d13001e60a7f7b22b12ec89bbc.tar.gz |
COMPMID-3069: Improve compilation time by removing regex from test framework headers
Regex is used as an implementation detail by TestFilter and libnpy,
is an expensive header to parse, and also instantiates static objects.
Move TestFilter out of Framework.h by using a partial definition and
a unique_ptr instead of storing the TestFilter by value.
Move npy.h out of AssetsLibrary.h by moving part of a template
definition into AssetsLibrary.cpp
Knocks about 15% off compilation time of small test cases (for me,
knocked .7s off 5s compilation of HogDetector.cpp)
Signed-off-by: Matthew Bentham <matthew.bentham@arm.com>
Change-Id: I1dce18855d0752ec25b2165fddbc6861a4c55a76
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/c/VisualCompute/ComputeLibrary/+/229181
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Tested-by: bsgcomp <bsgcomp@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2856
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Diffstat (limited to 'tests/AssetsLibrary.h')
-rw-r--r-- | tests/AssetsLibrary.h | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h index e625c37505..84653ed089 100644 --- a/tests/AssetsLibrary.h +++ b/tests/AssetsLibrary.h @@ -32,10 +32,6 @@ #include "arm_compute/core/Types.h" #include "arm_compute/core/Window.h" #include "arm_compute/core/utils/misc/Random.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#include "libnpy/npy.hpp" -#pragma GCC diagnostic pop #include "tests/RawTensor.h" #include "tests/TensorCache.h" #include "tests/Utils.h" @@ -469,6 +465,16 @@ inline std::vector<std::pair<T, T>> convert_range_pair(const std::vector<AssetsL }); return converted; } + +/* Read npy header and check the payload is suitable for the specified type and shape + * + * @param[in] stream ifstream of the npy file + * @param[in] expect_typestr Expected typestr + * @param[in] expect_shape Shape of tensor expected to receive the data + * + * @note Advances stream to the beginning of the data payload + */ +void validate_npy_header(std::ifstream &stream, const std::string &expect_typestr, const TensorShape &expect_shape); } // namespace detail template <typename T, typename D> @@ -959,41 +965,14 @@ void AssetsLibrary::fill_layer_data(T &&tensor, std::string name) const #endif /* _WIN32 */ const std::string path = _library_path + path_separator + name; - std::vector<unsigned long> shape; - // Open file std::ifstream stream(path, std::ios::in | std::ios::binary); if(!stream.good()) { throw framework::FileNotFound("Could not load npy file: " + path); } - std::string header = npy::read_header(stream); - - // Parse header - bool fortran_order = false; - std::string typestr; - npy::parse_header(header, typestr, fortran_order, shape); - // Check if the typestring matches the given one - std::string expect_typestr = get_typestring(tensor.data_type()); - ARM_COMPUTE_ERROR_ON_MSG(typestr != expect_typestr, "Typestrings mismatch"); - - // Validate tensor shape - ARM_COMPUTE_ERROR_ON_MSG(shape.size() != tensor.shape().num_dimensions(), "Tensor ranks mismatch"); - if(fortran_order) - { - for(size_t i = 0; i < shape.size(); ++i) - { - ARM_COMPUTE_ERROR_ON_MSG(tensor.shape()[i] != shape[i], "Tensor dimensions mismatch"); - } - } - else - { - for(size_t i = 0; i < shape.size(); ++i) - { - ARM_COMPUTE_ERROR_ON_MSG(tensor.shape()[i] != shape[shape.size() - i - 1], "Tensor dimensions mismatch"); - } - } + validate_npy_header(stream, tensor.data_type(), tensor.shape()); // Read data if(tensor.padding().empty()) |