COMPMID-457 Fix F16 NormalizationLayer CL kernel
Change-Id: I307c7ef6a49c852615c4425dc8dc0b1066a6974f
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/81895
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h
index 58738f8..3dd30e7 100644
--- a/tests/AssetsLibrary.h
+++ b/tests/AssetsLibrary.h
@@ -473,6 +473,12 @@
break;
}
case DataType::F16:
+ {
+ // It doesn't make sense to check [-inf, inf], so hard code it to a big number
+ std::uniform_real_distribution<float> distribution_f16(-100.f, 100.f);
+ fill(tensor, distribution_f16, seed_offset);
+ break;
+ }
case DataType::F32:
{
// It doesn't make sense to check [-inf, inf], so hard code it to a big number
diff --git a/tests/benchmark_new/CL/NormalizationLayer.cpp b/tests/benchmark_new/CL/NormalizationLayer.cpp
index 6d5142c..7ba78a5 100644
--- a/tests/benchmark_new/CL/NormalizationLayer.cpp
+++ b/tests/benchmark_new/CL/NormalizationLayer.cpp
@@ -30,25 +30,31 @@
#include "framework/datasets/Datasets.h"
#include "tests/CL/CLAccessor.h"
#include "tests/TypePrinter.h"
-#include "tests/datasets_new/NormalizationLayerDataset.h"
+#include "tests/datasets_new/AlexNetNormalizationLayerDataset.h"
+#include "tests/datasets_new/GoogLeNetNormalizationLayerDataset.h"
#include "tests/fixtures_new/NormalizationLayerFixture.h"
namespace arm_compute
{
namespace test
{
+namespace
+{
+const auto normalization_layer_data_types = framework::dataset::make("DataType", { DataType::F16, DataType::F32 });
+} // namespace
+
using CLNormalizationLayerFixture = NormalizationLayerFixture<CLTensor, CLNormalizationLayer, CLAccessor>;
TEST_SUITE(CL)
REGISTER_FIXTURE_DATA_TEST_CASE(AlexNetNormalizationLayer, CLNormalizationLayerFixture, framework::DatasetMode::ALL,
framework::dataset::combine(framework::dataset::combine(datasets::AlexNetNormalizationLayerDataset(),
- framework::dataset::make("DataType", { DataType::F32 })),
+ normalization_layer_data_types),
framework::dataset::make("Batches", { 1, 4, 8 })));
REGISTER_FIXTURE_DATA_TEST_CASE(GoogLeNetNormalizationLayer, CLNormalizationLayerFixture, framework::DatasetMode::ALL,
framework::dataset::combine(framework::dataset::combine(datasets::GoogLeNetNormalizationLayerDataset(),
- framework::dataset::make("DataType", DataType::F32)),
+ normalization_layer_data_types),
framework::dataset::make("Batches", { 1, 4, 8 })));
TEST_SUITE_END()
diff --git a/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp b/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp
index 85cd701..e6d91d9 100644
--- a/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp
+++ b/tests/benchmark_new/CL/SYSTEM/AlexNet.cpp
@@ -36,7 +36,6 @@
#include "framework/datasets/Datasets.h"
#include "tests/CL/CLAccessor.h"
#include "tests/TypePrinter.h"
-#include "tests/datasets_new/ActivationLayerDataset.h"
#include "tests/fixtures_new/AlexNetFixture.h"
namespace arm_compute
diff --git a/tests/benchmark_new/NEON/NormalizationLayer.cpp b/tests/benchmark_new/NEON/NormalizationLayer.cpp
index c3d4969..71dd9c3 100644
--- a/tests/benchmark_new/NEON/NormalizationLayer.cpp
+++ b/tests/benchmark_new/NEON/NormalizationLayer.cpp
@@ -30,25 +30,34 @@
#include "framework/datasets/Datasets.h"
#include "tests/NEON/Accessor.h"
#include "tests/TypePrinter.h"
-#include "tests/datasets_new/NormalizationLayerDataset.h"
+#include "tests/datasets_new/AlexNetNormalizationLayerDataset.h"
+#include "tests/datasets_new/GoogLeNetNormalizationLayerDataset.h"
#include "tests/fixtures_new/NormalizationLayerFixture.h"
namespace arm_compute
{
namespace test
{
+namespace
+{
+#ifdef ARM_COMPUTE_ENABLE_FP16
+const auto normalization_layer_data_types = framework::dataset::make("DataType", { DataType::F16, DataType::F32, DataType::QS8 });
+#else /* ARM_COMPUTE_ENABLE_FP16 */
+const auto normalization_layer_data_types = framework::dataset::make("DataType", { DataType::F32, DataType::QS8 });
+#endif /* ARM_COMPUTE_ENABLE_FP16 */
+} // namespace
using NENormalizationLayerFixture = NormalizationLayerFixture<Tensor, NENormalizationLayer, Accessor>;
TEST_SUITE(NEON)
REGISTER_FIXTURE_DATA_TEST_CASE(AlexNetNormalizationLayer, NENormalizationLayerFixture, framework::DatasetMode::ALL,
framework::dataset::combine(framework::dataset::combine(datasets::AlexNetNormalizationLayerDataset(),
- framework::dataset::make("DataType", { DataType::F32, DataType::QS8 })),
+ normalization_layer_data_types),
framework::dataset::make("Batches", { 1, 4, 8 })));
REGISTER_FIXTURE_DATA_TEST_CASE(GoogLeNetNormalizationLayer, NENormalizationLayerFixture, framework::DatasetMode::ALL,
framework::dataset::combine(framework::dataset::combine(datasets::GoogLeNetNormalizationLayerDataset(),
- framework::dataset::make("DataType", DataType::F32)),
+ normalization_layer_data_types),
framework::dataset::make("Batches", { 1, 4, 8 })));
TEST_SUITE_END()
diff --git a/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp b/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp
index e97919a..282d3e6 100644
--- a/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp
+++ b/tests/benchmark_new/NEON/SYSTEM/AlexNet.cpp
@@ -36,13 +36,21 @@
#include "framework/datasets/Datasets.h"
#include "tests/NEON/Accessor.h"
#include "tests/TypePrinter.h"
-#include "tests/datasets_new/ActivationLayerDataset.h"
#include "tests/fixtures_new/AlexNetFixture.h"
namespace arm_compute
{
namespace test
{
+namespace
+{
+#ifdef ARM_COMPUTE_ENABLE_FP16
+const auto alex_net_data_types = framework::dataset::make("DataType", { DataType::F16, DataType::F32, DataType::QS8 });
+#else /* ARM_COMPUTE_ENABLE_FP16 */
+const auto alex_net_data_types = framework::dataset::make("DataType", { DataType::F32, DataType::QS8 });
+#endif /* ARM_COMPUTE_ENABLE_FP16 */
+} // namespace
+
using NEAlexNetFixture = AlexNetFixture<ITensor,
Tensor,
SubTensor,
@@ -58,7 +66,7 @@
TEST_SUITE(SYSTEM_TEST)
REGISTER_FIXTURE_DATA_TEST_CASE(AlexNet, NEAlexNetFixture, framework::DatasetMode::ALL,
- framework::dataset::combine(framework::dataset::make("DataType", { DataType::F32, DataType::QS8 }),
+ framework::dataset::combine(alex_net_data_types,
framework::dataset::make("Batches", { 1, 4, 8 })));
TEST_SUITE_END()
diff --git a/tests/datasets_new/NormalizationLayerDataset.h b/tests/datasets_new/AlexNetNormalizationLayerDataset.h
similarity index 69%
copy from tests/datasets_new/NormalizationLayerDataset.h
copy to tests/datasets_new/AlexNetNormalizationLayerDataset.h
index 73e215b..5714c5c 100644
--- a/tests/datasets_new/NormalizationLayerDataset.h
+++ b/tests/datasets_new/AlexNetNormalizationLayerDataset.h
@@ -21,8 +21,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#ifndef ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET
-#define ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET
+#ifndef ARM_COMPUTE_TEST_ALEXNET_NORMALIZATION_LAYER_DATASET
+#define ARM_COMPUTE_TEST_ALEXNET_NORMALIZATION_LAYER_DATASET
#include "framework/datasets/Datasets.h"
@@ -52,26 +52,7 @@
AlexNetNormalizationLayerDataset(AlexNetNormalizationLayerDataset &&) = default;
~AlexNetNormalizationLayerDataset() = default;
};
-
-class GoogLeNetNormalizationLayerDataset final : public
- framework::dataset::CartesianProductDataset<framework::dataset::InitializerListDataset<TensorShape>, framework::dataset::SingletonDataset<NormalizationLayerInfo>>
-{
-public:
- GoogLeNetNormalizationLayerDataset()
- : CartesianProductDataset
- {
- framework::dataset::make("Shape", { // conv2/norm2
- TensorShape(56U, 56U, 192U),
- // pool1/norm1
- TensorShape(56U, 56U, 64U) }),
- framework::dataset::make("Info", NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f))
- }
- {
- }
- GoogLeNetNormalizationLayerDataset(GoogLeNetNormalizationLayerDataset &&) = default;
- ~GoogLeNetNormalizationLayerDataset() = default;
-};
} // namespace datasets
} // namespace test
} // namespace arm_compute
-#endif /* ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET */
+#endif /* ARM_COMPUTE_TEST_ALEXNET_NORMALIZATION_LAYER_DATASET */
diff --git a/tests/datasets_new/NormalizationLayerDataset.h b/tests/datasets_new/GoogLeNetNormalizationLayerDataset.h
similarity index 71%
rename from tests/datasets_new/NormalizationLayerDataset.h
rename to tests/datasets_new/GoogLeNetNormalizationLayerDataset.h
index 73e215b..2c20a6b 100644
--- a/tests/datasets_new/NormalizationLayerDataset.h
+++ b/tests/datasets_new/GoogLeNetNormalizationLayerDataset.h
@@ -21,8 +21,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#ifndef ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET
-#define ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET
+#ifndef ARM_COMPUTE_TEST_GOOGLENET_NORMALIZATION_LAYER_DATASET
+#define ARM_COMPUTE_TEST_GOOGLENET_NORMALIZATION_LAYER_DATASET
#include "framework/datasets/Datasets.h"
@@ -37,22 +37,6 @@
{
namespace datasets
{
-class AlexNetNormalizationLayerDataset final : public
- framework::dataset::CartesianProductDataset<framework::dataset::InitializerListDataset<TensorShape>, framework::dataset::SingletonDataset<NormalizationLayerInfo>>
-{
-public:
- AlexNetNormalizationLayerDataset()
- : CartesianProductDataset
- {
- framework::dataset::make("Shape", { TensorShape(55U, 55U, 96U), TensorShape(27U, 27U, 256U) }),
- framework::dataset::make("Info", NormalizationLayerInfo(NormType::CROSS_MAP, 5, 0.0001f, 0.75f))
- }
- {
- }
- AlexNetNormalizationLayerDataset(AlexNetNormalizationLayerDataset &&) = default;
- ~AlexNetNormalizationLayerDataset() = default;
-};
-
class GoogLeNetNormalizationLayerDataset final : public
framework::dataset::CartesianProductDataset<framework::dataset::InitializerListDataset<TensorShape>, framework::dataset::SingletonDataset<NormalizationLayerInfo>>
{
@@ -74,4 +58,4 @@
} // namespace datasets
} // namespace test
} // namespace arm_compute
-#endif /* ARM_COMPUTE_TEST_NORMALIZATION_LAYER_DATASET */
+#endif /* ARM_COMPUTE_TEST_GOOGLENET_NORMALIZATION_LAYER_DATASET */
diff --git a/tests/validation/CL/PixelWiseMultiplication.cpp b/tests/validation/CL/PixelWiseMultiplication.cpp
index a95c823..375c77d 100644
--- a/tests/validation/CL/PixelWiseMultiplication.cpp
+++ b/tests/validation/CL/PixelWiseMultiplication.cpp
@@ -38,6 +38,7 @@
namespace
{
const float tolerance_f32 = 1.f; /**< Tolerance value for comparing reference's output against implementation's output for float input */
+const float tolerance_f16 = 1.f; /**< Tolerance value for comparing reference's output against implementation's output for float input */
/** Compute CL pixel-wise multiplication function.
*
@@ -88,6 +89,24 @@
BOOST_AUTO_TEST_SUITE(CL)
BOOST_AUTO_TEST_SUITE(PixelWiseMultiplication)
+BOOST_AUTO_TEST_SUITE(Float16)
+BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
+BOOST_DATA_TEST_CASE(RunSmall, SmallShapes() * DataType::F16 *ConvertPolicies() * RoundingPolicy::TO_NEAREST_UP,
+ shape, dt, convert_policy, rounding_policy)
+{
+ constexpr float scale = 1.f / 255.f;
+
+ // Compute function
+ CLTensor dst = compute_pixel_wise_multiplication(shape, dt, dt, dt, scale, convert_policy, rounding_policy);
+
+ // Compute reference
+ RawTensor ref_dst = Reference::compute_reference_pixel_wise_multiplication(shape, dt, dt, dt, scale, convert_policy, rounding_policy);
+
+ // Validate output
+ validate(CLAccessor(dst), ref_dst, tolerance_f16);
+}
+BOOST_AUTO_TEST_SUITE_END()
+
BOOST_AUTO_TEST_SUITE(Float)
BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit"))
BOOST_DATA_TEST_CASE(RunSmall, SmallShapes() * DataType::F32 *ConvertPolicies() * RoundingPolicy::TO_NEAREST_UP,