blob: f127b8a3bbec497fb3c04313d50dc6e0002831a4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
* Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file Swizzle.h
* @ingroup COM_AI_RUNTIME
* @brief This file defines ARMComputeAxis class and utility functions to support mapping
* between arm compute axis and NNAPI axis
*/
#ifndef __SWIZZLE_H__
#define __SWIZZLE_H__
/**
* @brief Class to represent arm compute axis
*/
class ARMComputeAxis
{
public:
/**
* @brief Construct a new ARMComputeAxis object
*/
ARMComputeAxis() = default;
public:
/**
* @brief Construct a new ARMComputeAxis object
* @param[in] value Raw axis number
*/
explicit ARMComputeAxis(uint32_t value) : _value{value}
{
// DO NOTHING
}
public:
/**
* @brief Get raw axis number
* @return Raw axis number
*/
uint32_t value(void) const { return _value; }
private:
uint32_t _value;
};
/**
* @brief Convert T/F Lite / NNAPI axis (based on ...NHWC) to arm compute axis (WHCN...)
* @param[in] rank Rank of shape
* @param[in] axis Axis to map
* @return ARMComputeAxis including arm compute axis info
*/
inline ARMComputeAxis ToARMComputeAxis(uint32_t rank, uint32_t axis)
{
assert(rank > axis);
const ARMComputeAxis reversed{(rank - axis) - 1};
if (rank < 4)
{
return reversed;
}
// DEPTH
if (0 == reversed.value())
{
return ARMComputeAxis{2};
}
// WIDTH
if (1 == reversed.value())
{
return ARMComputeAxis{0};
}
// HEIGHT
if (2 == reversed.value())
{
return ARMComputeAxis{1};
}
// ELSE
return reversed;
}
#include <cassert>
/**
* @brief Covert bitmask info from NNAPI axis to arm compute axis
* @param[in] in Bitmask data
* @param[in] numOfBits Used bits (rank)
* @return Coverted bitmask
*/
template <typename T> inline T ReorderBits(T in, size_t numOfBits)
{
assert(numOfBits > 0);
T out = 0;
for (int32_t i = numOfBits - 1; i >= 0; --i)
{
const uint32_t toShift = numOfBits - ToARMComputeAxis(numOfBits, i).value() - 1;
out += ((in & 1) << toShift);
in >>= 1;
}
return out;
}
#endif // __SWIZZLE_H__
|