1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include <armnnUtils/FloatingPointConverter.hpp> 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include <Half.hpp> 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #include <vector> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TestFPConversion") 15*89c4ff92SAndroid Build Coastguard Worker { 16*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("TestConvertFp32ToFp16") 17*89c4ff92SAndroid Build Coastguard Worker { 18*89c4ff92SAndroid Build Coastguard Worker using namespace half_float::literal; 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker float floatArray[] = { 1.0f, 2.0f, 0.5f, 3.1f, 2.4f, 21*89c4ff92SAndroid Build Coastguard Worker 5.666f, 6.444f, 7.1f, 432.121f, 12.22f }; 22*89c4ff92SAndroid Build Coastguard Worker size_t numFloats = sizeof(floatArray) / sizeof(floatArray[0]); 23*89c4ff92SAndroid Build Coastguard Worker std::vector<armnn::Half> convertedBuffer(numFloats, 0.0_h); 24*89c4ff92SAndroid Build Coastguard Worker 25*89c4ff92SAndroid Build Coastguard Worker armnnUtils::FloatingPointConverter::ConvertFloat32To16(floatArray, numFloats, convertedBuffer.data()); 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker for (size_t i = 0; i < numFloats; i++) 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker armnn::Half expected(floatArray[i]); 30*89c4ff92SAndroid Build Coastguard Worker armnn::Half actual = convertedBuffer[i]; 31*89c4ff92SAndroid Build Coastguard Worker CHECK_EQ(expected, actual); 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker float convertedHalf = actual; 34*89c4ff92SAndroid Build Coastguard Worker CHECK_EQ(floatArray[i], doctest::Approx(convertedHalf).epsilon(0.07)); 35*89c4ff92SAndroid Build Coastguard Worker } 36*89c4ff92SAndroid Build Coastguard Worker } 37*89c4ff92SAndroid Build Coastguard Worker 38*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("TestConvertFp16ToFp32") 39*89c4ff92SAndroid Build Coastguard Worker { 40*89c4ff92SAndroid Build Coastguard Worker using namespace half_float::literal; 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker armnn::Half halfArray[] = { 1.0_h, 2.0_h, 0.5_h, 3.1_h, 2.4_h, 43*89c4ff92SAndroid Build Coastguard Worker 5.666_h, 6.444_h, 7.1_h, 432.121_h, 12.22_h }; 44*89c4ff92SAndroid Build Coastguard Worker size_t numFloats = sizeof(halfArray) / sizeof(halfArray[0]); 45*89c4ff92SAndroid Build Coastguard Worker std::vector<float> convertedBuffer(numFloats, 0.0f); 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker armnnUtils::FloatingPointConverter::ConvertFloat16To32(halfArray, numFloats, convertedBuffer.data()); 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker for (size_t i = 0; i < numFloats; i++) 50*89c4ff92SAndroid Build Coastguard Worker { 51*89c4ff92SAndroid Build Coastguard Worker float expected(halfArray[i]); 52*89c4ff92SAndroid Build Coastguard Worker float actual = convertedBuffer[i]; 53*89c4ff92SAndroid Build Coastguard Worker CHECK_EQ(expected, actual); 54*89c4ff92SAndroid Build Coastguard Worker } 55*89c4ff92SAndroid Build Coastguard Worker } 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker } 58