ArmNN
 22.02
FloatingPointConverter.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 
8 #include "BFloat16.hpp"
9 #include "Half.hpp"
10 
11 #include <armnn/utility/Assert.hpp>
12 
13 namespace armnnUtils
14 {
15 
16 void FloatingPointConverter::ConvertFloat32To16(const float* srcFloat32Buffer,
17  size_t numElements,
18  void* dstFloat16Buffer)
19 {
20  ARMNN_ASSERT(srcFloat32Buffer != nullptr);
21  ARMNN_ASSERT(dstFloat16Buffer != nullptr);
22 
23  armnn::Half* pHalf = static_cast<armnn::Half*>(dstFloat16Buffer);
24 
25  for (size_t i = 0; i < numElements; i++)
26  {
27  pHalf[i] = armnn::Half(srcFloat32Buffer[i]);
28  }
29 }
30 
31 void FloatingPointConverter::ConvertFloat16To32(const void* srcFloat16Buffer,
32  size_t numElements,
33  float* dstFloat32Buffer)
34 {
35  ARMNN_ASSERT(srcFloat16Buffer != nullptr);
36  ARMNN_ASSERT(dstFloat32Buffer != nullptr);
37 
38  const armnn::Half* pHalf = static_cast<const armnn::Half*>(srcFloat16Buffer);
39 
40  for (size_t i = 0; i < numElements; i++)
41  {
42  dstFloat32Buffer[i] = pHalf[i];
43  }
44 }
45 
46 void FloatingPointConverter::ConvertFloat32ToBFloat16(const float* srcFloat32Buffer,
47  size_t numElements,
48  void* dstBFloat16Buffer)
49 {
50  ARMNN_ASSERT(srcFloat32Buffer != nullptr);
51  ARMNN_ASSERT(dstBFloat16Buffer != nullptr);
52 
53  armnn::BFloat16* bf16 = static_cast<armnn::BFloat16*>(dstBFloat16Buffer);
54 
55  for (size_t i = 0; i < numElements; i++)
56  {
57  bf16[i] = armnn::BFloat16(srcFloat32Buffer[i]);
58  }
59 }
60 
61 void FloatingPointConverter::ConvertBFloat16ToFloat32(const void* srcBFloat16Buffer,
62  size_t numElements,
63  float* dstFloat32Buffer)
64 {
65  ARMNN_ASSERT(srcBFloat16Buffer != nullptr);
66  ARMNN_ASSERT(dstFloat32Buffer != nullptr);
67 
68  const armnn::BFloat16* bf16 = static_cast<const armnn::BFloat16*>(srcBFloat16Buffer);
69 
70  for (size_t i = 0; i < numElements; i++)
71  {
72  dstFloat32Buffer[i] = bf16[i].ToFloat32();
73  }
74 }
75 
76 } //namespace armnnUtils
float ToFloat32() const
Definition: BFloat16.hpp:86
static void ConvertBFloat16ToFloat32(const void *srcBFloat16Buffer, size_t numElements, float *dstFloat32Buffer)
static void ConvertFloat32To16(const float *srcFloat32Buffer, size_t numElements, void *dstFloat16Buffer)
Converts a buffer of FP32 values to FP16, and stores in the given dstFloat16Buffer.
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
static void ConvertFloat16To32(const void *srcFloat16Buffer, size_t numElements, float *dstFloat32Buffer)
static void ConvertFloat32ToBFloat16(const float *srcFloat32Buffer, size_t numElements, void *dstBFloat16Buffer)
half_float::half Half
Definition: Half.hpp:18