Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
Mace
提交
1b234130
Mace
项目概览
慢慢CG
/
Mace
与 Fork 源项目一致
Fork自
Xiaomi / Mace
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Mace
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
1b234130
编写于
10月 31, 2019
作者:
B
Bin Li
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support Hexagon power control
上级
a5cbc20d
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
150 addition
and
14 deletion
+150
-14
include/mace/public/mace.h
include/mace/public/mace.h
+32
-3
mace/core/CMakeLists.txt
mace/core/CMakeLists.txt
+1
-1
mace/core/runtime/hexagon/hexagon_dsp_wrapper.cc
mace/core/runtime/hexagon/hexagon_dsp_wrapper.cc
+56
-4
mace/core/runtime/hexagon/hexagon_dsp_wrapper.h
mace/core/runtime/hexagon/hexagon_dsp_wrapper.h
+10
-1
mace/libmace/mace.cc
mace/libmace/mace.cc
+36
-2
mace/tools/BUILD.bazel
mace/tools/BUILD.bazel
+10
-2
mace/tools/mace_run.cc
mace/tools/mace_run.cc
+3
-1
third_party/nnlib/arm64-v8a/libhexagon_controller.so
third_party/nnlib/arm64-v8a/libhexagon_controller.so
+0
-0
third_party/nnlib/armeabi-v7a/libhexagon_controller.so
third_party/nnlib/armeabi-v7a/libhexagon_controller.so
+0
-0
third_party/nnlib/hexagon_nn.h
third_party/nnlib/hexagon_nn.h
+2
-0
third_party/nnlib/v60/libhexagon_nn_skel.so
third_party/nnlib/v60/libhexagon_nn_skel.so
+0
-0
third_party/nnlib/v65/libhexagon_nn_skel.so
third_party/nnlib/v65/libhexagon_nn_skel.so
+0
-0
third_party/nnlib/v66/libhexagon_nn_skel.so
third_party/nnlib/v66/libhexagon_nn_skel.so
+0
-0
未找到文件。
include/mace/public/mace.h
浏览文件 @
1b234130
...
...
@@ -90,6 +90,18 @@ enum CPUAffinityPolicy {
AFFINITY_POWER_SAVE
=
4
,
};
// Voltage corners for clock frequencies, please refer to
// docs/Hap_power_set_dcvs_2.html in Hexagon SDK for more detailed information.
enum
HexagonNNCornerType
{
HEXAGON_NN_CORNER_RELEASE
,
HEXAGON_NN_CORNER_TURBO
,
HEXAGON_NN_CORNER_NOMPLUS
,
HEXAGON_NN_CORNER_NOMINAL
,
HEXAGON_NN_CORNER_SVSPLUS
,
HEXAGON_NN_CORNER_SVS
,
HEXAGON_NN_CORNER_SVS2
,
};
struct
CallStats
{
int64_t
start_micros
;
int64_t
end_micros
;
...
...
@@ -281,7 +293,7 @@ class MACE_API MaceEngineConfig {
///
/// Just use one GPUContext for multiple models run on GPU.
/// \param context created use GPUContextBuilder
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ed
.
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ure
.
MaceStatus
SetGPUContext
(
std
::
shared_ptr
<
GPUContext
>
context
);
/// \brief Set GPU hints, currently only supports Adreno GPU.
...
...
@@ -291,7 +303,7 @@ class MACE_API MaceEngineConfig {
///
/// \param perf_hint performance hint
/// \param priority_hint priority hint
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ed
.
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ure
.
MaceStatus
SetGPUHints
(
GPUPerfHint
perf_hint
,
GPUPriorityHint
priority_hint
);
...
...
@@ -312,10 +324,27 @@ class MACE_API MaceEngineConfig {
/// \param status MACE_SUCCESS for successful, or it can't reliabley
/// detect big-LITTLE cores (see GetBigLittleCoreIDs). In such cases, it's
/// suggested to use AFFINITY_NONE to use all cores.
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ed
.
/// \return MaceStatus::MACE_SUCCESS for success, other for fail
ure
.
MaceStatus
SetCPUThreadPolicy
(
int
num_threads_hint
,
CPUAffinityPolicy
policy
);
/// \brief Set Hexagon DSP power parameters
///
/// Caution: this function may hurt performance if improper
/// parameters provided. For most performance critical applications, set
/// HexagonNNCornerType to HEXAGON_NN_CORNER_TURBO, enable dynamic clock
/// voltage scaling(DCVS) and set sleep latency to 100us works just fine.
/// If a more balanced scheme between performance and power consumption
/// is needed, these three parameters may be tweaked to achieve that.
/// \param corner DCVS voltage target corner, can be set even when DCVS
/// is disabled.
/// \param dcvs_enable enable or disable DCVS.
/// \param latency sleep latency, in micro seconds.
/// \return MaceStatus::MACE_SUCCESS for success, other for failure.
MaceStatus
SetHexagonPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
);
private:
class
Impl
;
std
::
unique_ptr
<
Impl
>
impl_
;
...
...
mace/core/CMakeLists.txt
浏览文件 @
1b234130
...
...
@@ -37,7 +37,7 @@ endif(MACE_ENABLE_HEXAGON_DSP)
if
(
MACE_ENABLE_HEXAGON_HTA
)
set
(
CORE_SRCS
${
CORE_SRCS
}
runtime/hexagon/hexagon_hta_wrapper.cc
)
set
(
EXTRA_LINK_LIBS
${
EXTRA_LINK_LIBS
}
hta_
controller hta_hexagon_runtime npu
)
set
(
EXTRA_LINK_LIBS
${
EXTRA_LINK_LIBS
}
hta_
hexagon_runtime
)
endif
(
MACE_ENABLE_HEXAGON_HTA
)
if
(
MACE_ENABLE_MTK_APU
)
...
...
mace/core/runtime/hexagon/hexagon_dsp_wrapper.cc
浏览文件 @
1b234130
...
...
@@ -87,17 +87,53 @@ std::string FloatToString(const FloatType v, const int32_t precision) {
stream
<<
std
::
fixed
<<
std
::
setprecision
(
precision
)
<<
v
;
return
stream
.
str
();
}
hexagon_nn_corner_type
TransformCornerType
(
HexagonNNCornerType
corner
)
{
switch
(
corner
)
{
case
HEXAGON_NN_CORNER_RELEASE
:
return
NN_CORNER_RELEASE
;
case
HEXAGON_NN_CORNER_TURBO
:
return
NN_CORNER_TURBO
;
case
HEXAGON_NN_CORNER_NOMPLUS
:
return
NN_CORNER_NOMPLUS
;
case
HEXAGON_NN_CORNER_NOMINAL
:
return
NN_CORNER_NOMINAL
;
case
HEXAGON_NN_CORNER_SVSPLUS
:
return
NN_CORNER_SVSPLUS
;
case
HEXAGON_NN_CORNER_SVS
:
return
NN_CORNER_SVS
;
case
HEXAGON_NN_CORNER_SVS2
:
return
NN_CORNER_SVS2
;
default:
LOG
(
FATAL
)
<<
"Wrong Hexagon NN corner type: "
<<
corner
;
return
NN_CORNER_TURBO
;
}
}
}
// namespace
HexagonDSPWrapper
::
HexagonDSPWrapper
()
{
std
::
string
env_log_execute_time_str
;
GetEnv
(
"MACE_DSP_LOG_EXECUTE_TIME"
,
&
env_log_execute_time_str
);
if
(
env_log_execute_time_str
.
empty
())
{
log_execute_time_
=
false
;
}
else
{
log_execute_time_
=
static_cast
<
bool
>
(
std
::
stoi
(
env_log_execute_time_str
));
}
}
int
HexagonDSPWrapper
::
GetVersion
()
{
int
version
;
MACE_CHECK
(
hexagon_nn_version
(
&
version
)
==
0
,
"get version error"
);
return
version
;
}
bool
HexagonDSPWrapper
::
SetPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
)
{
int
ret
=
hexagon_nn_set_clocks
(
TransformCornerType
(
corner
),
dcvs_enable
?
NN_DCVS_ENABLE
:
NN_DCVS_DISABLE
,
static_cast
<
uint32_t
>
(
std
::
max
(
0
,
latency
)));
return
ret
==
0
;
}
bool
HexagonDSPWrapper
::
Config
()
{
LOG
(
INFO
)
<<
"Hexagon config"
;
MACE_CHECK
(
hexagon_nn_set_powersave_level
(
0
)
==
0
,
"hexagon power error"
);
MACE_CHECK
(
hexagon_nn_config
()
==
0
,
"hexagon config error"
);
return
true
;
}
...
...
@@ -111,7 +147,7 @@ bool HexagonDSPWrapper::Init() {
bool
HexagonDSPWrapper
::
Finalize
()
{
LOG
(
INFO
)
<<
"Hexagon finalize"
;
return
hexagon_nn_
set_powersave_level
(
1
)
==
0
;
return
hexagon_nn_
remove_clocks
(
)
==
0
;
}
bool
HexagonDSPWrapper
::
SetupGraph
(
const
NetDef
&
net_def
,
...
...
@@ -432,6 +468,11 @@ bool HexagonDSPWrapper::ExecuteGraph(const Tensor &input_tensor,
}
MACE_CHECK
(
output_bytes
==
output_tensor
->
raw_size
(),
"wrong output bytes inferred."
);
if
(
log_execute_time_
)
{
LOG
(
INFO
)
<<
"dsp cycles: "
<<
GetLastExecuteCycles
();
}
return
true
;
}
...
...
@@ -439,8 +480,8 @@ bool HexagonDSPWrapper::ExecuteGraphNew(
const
std
::
map
<
std
::
string
,
Tensor
*>
&
input_tensors
,
std
::
map
<
std
::
string
,
Tensor
*>
*
output_tensors
)
{
VLOG
(
2
)
<<
"Execute graph new: "
<<
nn_id_
;
uint32_t
num_inputs
=
static_cast
<
uint32_t
>
(
input_tensors
.
size
());
uint32_t
num_outputs
=
static_cast
<
uint32_t
>
(
output_tensors
->
size
());
auto
num_inputs
=
static_cast
<
uint32_t
>
(
input_tensors
.
size
());
auto
num_outputs
=
static_cast
<
uint32_t
>
(
output_tensors
->
size
());
MACE_CHECK
(
num_inputs_
==
static_cast
<
int
>
(
num_inputs
),
"Wrong inputs num"
);
MACE_CHECK
(
num_outputs_
==
static_cast
<
int
>
(
num_outputs
),
"Wrong outputs num"
);
...
...
@@ -519,7 +560,18 @@ bool HexagonDSPWrapper::ExecuteGraphNew(
" wrong output bytes inferred."
);
}
if
(
log_execute_time_
)
{
LOG
(
INFO
)
<<
"dsp cycles: "
<<
GetLastExecuteCycles
();
}
return
true
;
}
uint64_t
HexagonDSPWrapper
::
GetLastExecuteCycles
()
{
uint32_t
cycle_lo
;
uint32_t
cycle_hi
;
hexagon_nn_last_execution_cycles
(
nn_id_
,
&
cycle_lo
,
&
cycle_hi
);
return
(
static_cast
<
uint64_t
>
(
cycle_hi
)
<<
32
)
|
cycle_lo
;
}
}
// namespace mace
mace/core/runtime/hexagon/hexagon_dsp_wrapper.h
浏览文件 @
1b234130
...
...
@@ -27,7 +27,7 @@ namespace mace {
class
HexagonDSPWrapper
:
public
HexagonControlWrapper
{
public:
HexagonDSPWrapper
()
=
default
;
HexagonDSPWrapper
();
int
GetVersion
()
override
;
bool
Config
()
override
;
...
...
@@ -46,6 +46,15 @@ class HexagonDSPWrapper : public HexagonControlWrapper {
void
ResetPerfInfo
()
override
;
void
SetDebugLevel
(
int
level
)
override
;
static
bool
SetPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
);
private:
uint64_t
GetLastExecuteCycles
();
bool
log_execute_time_
;
MACE_DISABLE_COPY_AND_ASSIGN
(
HexagonDSPWrapper
);
};
}
// namespace mace
...
...
mace/libmace/mace.cc
浏览文件 @
1b234130
...
...
@@ -34,7 +34,10 @@
#include "mace/core/runtime/opencl/opencl_runtime.h"
#endif // MACE_ENABLE_OPENCL
#if defined(MACE_ENABLE_HEXAGON) || defined(MACE_ENABLE_HTA)
#if defined(MACE_ENABLE_HEXAGON)
#include "mace/core/runtime/hexagon/hexagon_device.h"
#include "mace/core/runtime/hexagon/hexagon_dsp_wrapper.h"
#elif defined(MACE_ENABLE_HTA)
#include "mace/core/runtime/hexagon/hexagon_device.h"
#endif
...
...
@@ -189,6 +192,10 @@ class MaceEngineConfig::Impl {
MaceStatus
SetCPUThreadPolicy
(
int
num_threads_hint
,
CPUAffinityPolicy
policy
);
MaceStatus
SetHexagonPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
);
inline
DeviceType
device_type
()
const
{
return
device_type_
;
}
...
...
@@ -228,7 +235,13 @@ MaceEngineConfig::Impl::Impl(const DeviceType device_type)
cpu_affinity_policy_
(
CPUAffinityPolicy
::
AFFINITY_NONE
),
gpu_context_
(
nullptr
),
gpu_priority_hint_
(
GPUPriorityHint
::
PRIORITY_LOW
),
gpu_perf_hint_
(
GPUPerfHint
::
PERF_NORMAL
)
{}
gpu_perf_hint_
(
GPUPerfHint
::
PERF_NORMAL
)
{
#ifdef MACE_ENABLE_HEXAGON
if
(
!
HexagonDSPWrapper
::
SetPower
(
HEXAGON_NN_CORNER_TURBO
,
true
,
100
))
{
LOG
(
WARNING
)
<<
"Hexagon set default clocks failed!"
;
}
#endif
}
MaceStatus
MaceEngineConfig
::
Impl
::
SetGPUContext
(
std
::
shared_ptr
<
GPUContext
>
context
)
{
...
...
@@ -252,6 +265,20 @@ MaceStatus MaceEngineConfig::Impl::SetCPUThreadPolicy(
return
MaceStatus
::
MACE_SUCCESS
;
}
MaceStatus
MaceEngineConfig
::
Impl
::
SetHexagonPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
)
{
MACE_UNUSED
(
corner
);
MACE_UNUSED
(
dcvs_enable
);
MACE_UNUSED
(
latency
);
bool
ret
=
false
;
#ifdef MACE_ENABLE_HEXAGON
ret
=
HexagonDSPWrapper
::
SetPower
(
corner
,
dcvs_enable
,
latency
);
#endif
return
ret
?
MaceStatus
::
MACE_SUCCESS
:
MaceStatus
::
MACE_RUNTIME_ERROR
;
}
MaceEngineConfig
::
MaceEngineConfig
(
const
DeviceType
device_type
)
:
impl_
(
new
MaceEngineConfig
::
Impl
(
device_type
))
{}
...
...
@@ -275,6 +302,13 @@ MaceStatus MaceEngineConfig::SetCPUThreadPolicy(
return
impl_
->
SetCPUThreadPolicy
(
num_threads_hint
,
policy
);
}
MaceStatus
MaceEngineConfig
::
SetHexagonPower
(
HexagonNNCornerType
corner
,
bool
dcvs_enable
,
int
latency
)
{
return
impl_
->
SetHexagonPower
(
corner
,
dcvs_enable
,
latency
);
}
// Mace Tensor
class
MaceTensor
::
Impl
{
public:
...
...
mace/tools/BUILD.bazel
浏览文件 @
1b234130
...
...
@@ -19,7 +19,11 @@ cc_binary(
"-Werror"
,
"-Wextra"
,
"-Wno-missing-field-initializers"
,
]
+
if_opencl_enabled
([
"-DMACE_ENABLE_OPENCL"
]),
]
+
if_opencl_enabled
([
"-DMACE_ENABLE_OPENCL"
,
])
+
if_hexagon_enabled
([
"-DMACE_ENABLE_HEXAGON"
,
]),
linkstatic
=
1
,
deps
=
[
"//external:gflags_nothreads"
,
...
...
@@ -39,7 +43,11 @@ cc_binary(
"-Werror"
,
"-Wextra"
,
"-Wno-missing-field-initializers"
,
]
+
if_opencl_enabled
([
"-DMACE_ENABLE_OPENCL"
]),
]
+
if_opencl_enabled
([
"-DMACE_ENABLE_OPENCL"
,
])
+
if_hexagon_enabled
([
"-DMACE_ENABLE_HEXAGON"
,
]),
linkopts
=
[
"-lm"
,
]
+
if_android
([
...
...
mace/tools/mace_run.cc
浏览文件 @
1b234130
...
...
@@ -196,7 +196,9 @@ bool RunModel(const std::string &model_name,
static_cast
<
GPUPriorityHint
>
(
FLAGS_gpu_priority_hint
));
}
#endif // MACE_ENABLE_OPENCL
#ifdef MACE_ENABLE_HEXAGON
config
.
SetHexagonPower
(
HEXAGON_NN_CORNER_TURBO
,
true
,
100
);
#endif
std
::
unique_ptr
<
mace
::
port
::
ReadOnlyMemoryRegion
>
model_graph_data
=
make_unique
<
mace
::
port
::
ReadOnlyBufferMemoryRegion
>
();
if
(
FLAGS_model_file
!=
""
)
{
...
...
third_party/nnlib/arm64-v8a/libhexagon_controller.so
浏览文件 @
1b234130
无法预览此类型文件
third_party/nnlib/armeabi-v7a/libhexagon_controller.so
浏览文件 @
1b234130
无法预览此类型文件
third_party/nnlib/hexagon_nn.h
浏览文件 @
1b234130
...
...
@@ -165,6 +165,8 @@ __QAIC_HEADER_EXPORT int __QAIC_HEADER(hexagon_nn_execute)(hexagon_nn_nn_id id,
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_teardown
)(
hexagon_nn_nn_id
id
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_set_powersave_level
)(
unsigned
int
level
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_set_powersave_details
)(
hexagon_nn_corner_type
corner
,
hexagon_nn_dcvs_type
dcvs
,
unsigned
int
latency
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_set_clocks
)(
hexagon_nn_corner_type
corner
,
hexagon_nn_dcvs_type
dcvs
,
unsigned
int
latency
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_remove_clocks
)()
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_get_perfinfo
)(
hexagon_nn_nn_id
id
,
hexagon_nn_perfinfo
*
info_out
,
int
info_outLen
,
unsigned
int
*
n_items
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_reset_perfinfo
)(
hexagon_nn_nn_id
id
,
unsigned
int
event
)
__QAIC_HEADER_ATTRIBUTE
;
__QAIC_HEADER_EXPORT
int
__QAIC_HEADER
(
hexagon_nn_last_execution_cycles
)(
hexagon_nn_nn_id
id
,
unsigned
int
*
cycles_lo
,
unsigned
int
*
cycles_hi
)
__QAIC_HEADER_ATTRIBUTE
;
...
...
third_party/nnlib/v60/libhexagon_nn_skel.so
浏览文件 @
1b234130
无法预览此类型文件
third_party/nnlib/v65/libhexagon_nn_skel.so
浏览文件 @
1b234130
无法预览此类型文件
third_party/nnlib/v66/libhexagon_nn_skel.so
浏览文件 @
1b234130
无法预览此类型文件
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录