MLCE-233 Added ability to enable fast_math through the NNAPI driver

 * Added -a command line option to enable fast_math on Neon/CL when launching the NNAPI driver
 * The invocation will look something like:
   /vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-armnn -v -c GpuAcc -n arm-armnn -a
 * Enabling fast_math may cause an increase in VTS or CTS test failures due to a change in precision

Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: Ifd8931f95efd65d3ae3aca9d9d61bd381e4e24a5
diff --git a/1.2/ArmnnDriverImpl.cpp b/1.2/ArmnnDriverImpl.cpp
index 4571fe0..6d713e0 100644
--- a/1.2/ArmnnDriverImpl.cpp
+++ b/1.2/ArmnnDriverImpl.cpp
@@ -130,6 +130,17 @@
     armnn::OptimizerOptions OptOptions;
     OptOptions.m_ReduceFp32ToFp16 = float32ToFloat16;
 
+    armnn::BackendOptions gpuAcc("GpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    armnn::BackendOptions cpuAcc("CpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    OptOptions.m_ModelOptions.push_back(gpuAcc);
+    OptOptions.m_ModelOptions.push_back(cpuAcc);
+
     std::vector<std::string> errMessages;
     try
     {
diff --git a/1.3/ArmnnDriverImpl.cpp b/1.3/ArmnnDriverImpl.cpp
index 6168c9d..b2524d3 100644
--- a/1.3/ArmnnDriverImpl.cpp
+++ b/1.3/ArmnnDriverImpl.cpp
@@ -141,6 +141,17 @@
     armnn::OptimizerOptions OptOptions;
     OptOptions.m_ReduceFp32ToFp16 = float32ToFloat16;
 
+    armnn::BackendOptions gpuAcc("GpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    armnn::BackendOptions cpuAcc("CpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    OptOptions.m_ModelOptions.push_back(gpuAcc);
+    OptOptions.m_ModelOptions.push_back(cpuAcc);
+
     std::vector<std::string> errMessages;
     try
     {
diff --git a/ArmnnDriverImpl.cpp b/ArmnnDriverImpl.cpp
index 9c6d51f..936cc6e 100644
--- a/ArmnnDriverImpl.cpp
+++ b/ArmnnDriverImpl.cpp
@@ -53,7 +53,6 @@
     return error;
 }
 
-
 } // namespace
 
 namespace armnn_driver
@@ -105,6 +104,17 @@
     armnn::OptimizerOptions OptOptions;
     OptOptions.m_ReduceFp32ToFp16 = float32ToFloat16;
 
+    armnn::BackendOptions gpuAcc("GpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    armnn::BackendOptions cpuAcc("CpuAcc",
+    {
+        { "FastMathEnabled", options.IsFastMathEnabled() }
+    });
+    OptOptions.m_ModelOptions.push_back(gpuAcc);
+    OptOptions.m_ModelOptions.push_back(cpuAcc);
+
     std::vector<std::string> errMessages;
     try
     {
diff --git a/DriverOptions.cpp b/DriverOptions.cpp
index 1f534b6..d179d65 100644
--- a/DriverOptions.cpp
+++ b/DriverOptions.cpp
@@ -35,6 +35,7 @@
     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
     , m_EnableGpuProfiling(false)
     , m_fp16Enabled(fp16Enabled)
+    , m_FastMathEnabled(false)
 {
 }
 
@@ -45,6 +46,7 @@
     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
     , m_EnableGpuProfiling(false)
     , m_fp16Enabled(fp16Enabled)
+    , m_FastMathEnabled(false)
 {
 }
 
@@ -54,6 +56,7 @@
     , m_ClTuningLevel(armnn::IGpuAccTunedParameters::TuningLevel::Rapid)
     , m_EnableGpuProfiling(false)
     , m_fp16Enabled(false)
+    , m_FastMathEnabled(false)
 {
     namespace po = boost::program_options;
 
@@ -104,6 +107,10 @@
          "exhaustive approach "
          "rapid: only 3 lws values should be tested for each kernel ")
 
+        ("fast-math,a",
+         po::bool_switch(&m_FastMathEnabled),
+         "Turns FastMath on")
+
         ("gpu-profiling,p",
          po::bool_switch(&m_EnableGpuProfiling),
          "Turns GPU profiling on")
diff --git a/DriverOptions.hpp b/DriverOptions.hpp
index b05647c..ba0919c 100644
--- a/DriverOptions.hpp
+++ b/DriverOptions.hpp
@@ -31,6 +31,7 @@
     armnn::IGpuAccTunedParameters::Mode GetClTunedParametersMode() const { return m_ClTunedParametersMode; }
     armnn::IGpuAccTunedParameters::TuningLevel GetClTuningLevel() const { return m_ClTuningLevel; }
     bool IsGpuProfilingEnabled() const { return m_EnableGpuProfiling; }
+    bool IsFastMathEnabled() const { return m_FastMathEnabled; }
     bool GetFp16Enabled() const { return m_fp16Enabled; }
     void SetBackends(const std::vector<armnn::BackendId>& backends) { m_Backends = backends; }
 
@@ -45,6 +46,7 @@
     armnn::IGpuAccTunedParameters::TuningLevel m_ClTuningLevel;
     bool m_EnableGpuProfiling;
     bool m_fp16Enabled;
+    bool m_FastMathEnabled;
 };
 
 } // namespace armnn_driver