arm_compute v18.02
Change-Id: I7207aa488e5470f235f39b6c188b4678dc38d1a6
diff --git a/examples/graph_vgg16.cpp b/examples/graph_vgg16.cpp
index 1a804a4..c8cc5b2 100644
--- a/examples/graph_vgg16.cpp
+++ b/examples/graph_vgg16.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018 ARM Limited.
+ * Copyright (c) 2017-2018 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -33,6 +33,20 @@
using namespace arm_compute::graph;
using namespace arm_compute::graph_utils;
+namespace
+{
+/** This function checks if we can use GEMM-based convolution trying to allocate a memory of size "size_in_bytes"
+ *
+ * @param[in] size_in_bytes Memory size in bytes needed for VGG-16
+ *
+ * @return The convolution layer hint
+ */
+ConvolutionMethodHint convolution_hint_vgg16(size_t size_in_bytes)
+{
+ return ((get_mem_free_from_meminfo() * 1024) >= size_in_bytes) ? ConvolutionMethodHint::GEMM : ConvolutionMethodHint::DIRECT;
+}
+} // namespace
+
/** Example demonstrating how to implement VGG16's network using the Compute Library's graph API
*
* @param[in] argc Number of arguments
@@ -47,13 +61,17 @@
std::string image; /* Image data */
std::string label; /* Label data */
- constexpr float mean_r = 123.68f; /* Mean value to subtract from red channel */
- constexpr float mean_g = 116.779f; /* Mean value to subtract from green channel */
- constexpr float mean_b = 103.939f; /* Mean value to subtract from blue channel */
+ // Create a preprocessor object
+ const std::array<float, 3> mean_rgb{ { 123.68f, 116.779f, 103.939f } };
+ std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<CaffePreproccessor>(mean_rgb);
- // Set target. 0 (NEON), 1 (OpenCL). By default it is NEON
- TargetHint target_hint = set_target_hint(argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0);
- ConvolutionMethodHint convolution_hint = ConvolutionMethodHint::DIRECT;
+ // Set target. 0 (NEON), 1 (OpenCL), 2 (OpenCL with Tuner). By default it is NEON
+ const int int_target_hint = argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0;
+ TargetHint target_hint = set_target_hint(int_target_hint);
+
+ // Check if we can use GEMM-based convolutions evaluating if the platform has at least 1.8 GB of available memory
+ const size_t memory_required = 1932735283L;
+ ConvolutionMethodHint convolution_hint = convolution_hint_vgg16(memory_required);
// Parse arguments
if(argc < 2)
@@ -90,8 +108,7 @@
graph << target_hint
<< convolution_hint
<< Tensor(TensorInfo(TensorShape(224U, 224U, 3U, 1U), 1, DataType::F32),
- get_input_accessor(image, mean_r, mean_g, mean_b))
- << ConvolutionMethodHint::DIRECT
+ get_input_accessor(image, std::move(preprocessor)))
// Layer 1
<< ConvolutionLayer(
3U, 3U, 64U,
@@ -208,6 +225,9 @@
// Softmax
<< SoftmaxLayer()
<< Tensor(get_output_accessor(label, 5));
+
+ // In order to enable the OpenCL tuner, graph_init() has to be called only when all nodes have been instantiated
+ graph.graph_init(int_target_hint == 2);
}
void do_run() override
{