Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle-Lite
提交
fda90afb
P
Paddle-Lite
项目概览
PaddlePaddle
/
Paddle-Lite
通知
338
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
271
列表
看板
标记
里程碑
合并请求
78
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle-Lite
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
271
Issue
271
列表
看板
标记
里程碑
合并请求
78
合并请求
78
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
fda90afb
编写于
4月 30, 2020
作者:
H
hong19860320
提交者:
GitHub
4月 30, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[APU] Refine the dynamic loading of libneuron_adapter.so (#3544)
上级
a7b96694
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
553 addition
and
404 deletion
+553
-404
cmake/device/apu.cmake
cmake/device/apu.cmake
+0
-31
lite/backends/apu/CMakeLists.txt
lite/backends/apu/CMakeLists.txt
+2
-1
lite/backends/apu/device.cc
lite/backends/apu/device.cc
+4
-33
lite/backends/apu/device.h
lite/backends/apu/device.h
+2
-2
lite/backends/apu/neuron_adapter.cc
lite/backends/apu/neuron_adapter.cc
+207
-0
lite/backends/apu/neuron_adapter.h
lite/backends/apu/neuron_adapter.h
+191
-0
lite/kernels/apu/CMakeLists.txt
lite/kernels/apu/CMakeLists.txt
+1
-1
lite/kernels/apu/bridges/CMakeLists.txt
lite/kernels/apu/bridges/CMakeLists.txt
+1
-1
lite/kernels/apu/bridges/conv_op.cc
lite/kernels/apu/bridges/conv_op.cc
+44
-53
lite/kernels/apu/bridges/fc_op.cc
lite/kernels/apu/bridges/fc_op.cc
+22
-28
lite/kernels/apu/bridges/graph.h
lite/kernels/apu/bridges/graph.h
+1
-5
lite/kernels/apu/bridges/pool_op.cc
lite/kernels/apu/bridges/pool_op.cc
+32
-38
lite/kernels/apu/bridges/softmax_op.cc
lite/kernels/apu/bridges/softmax_op.cc
+12
-18
lite/kernels/apu/bridges/utility.cc
lite/kernels/apu/bridges/utility.cc
+10
-67
lite/kernels/apu/bridges/utility.h
lite/kernels/apu/bridges/utility.h
+0
-48
lite/kernels/apu/subgraph_compute.cc
lite/kernels/apu/subgraph_compute.cc
+22
-76
lite/kernels/apu/subgraph_compute.h
lite/kernels/apu/subgraph_compute.h
+2
-2
未找到文件。
cmake/device/apu.cmake
浏览文件 @
fda90afb
...
@@ -32,34 +32,3 @@ endif()
...
@@ -32,34 +32,3 @@ endif()
message
(
STATUS
"APU_DDK_INC:
${
APU_DDK_INC
}
"
)
message
(
STATUS
"APU_DDK_INC:
${
APU_DDK_INC
}
"
)
include_directories
(
"
${
APU_DDK_ROOT
}
/include"
)
include_directories
(
"
${
APU_DDK_ROOT
}
/include"
)
set
(
APU_SUB_LIB_PATH
"lib64"
)
if
(
ARM_TARGET_ARCH_ABI STREQUAL
"armv8"
)
set
(
APU_SUB_LIB_PATH
"lib64"
)
endif
()
find_library
(
APU_NEURON_FILE NAMES neuron
PATHS
${
APU_DDK_ROOT
}
/
${
APU_SUB_LIB_PATH
}
)
find_library
(
APU_NEURON_ADAPTER_FILE NAMES neuron_adapter
PATHS
${
APU_DDK_ROOT
}
/
${
APU_SUB_LIB_PATH
}
)
if
(
NOT APU_NEURON_FILE
)
message
(
FATAL_ERROR
"Can not find APU_NEURON_FILE in
${
APU_DDK_ROOT
}
"
)
else
()
message
(
STATUS
"Found APU NEURON Library:
${
APU_NEURON_FILE
}
"
)
add_library
(
apu_neuron SHARED IMPORTED GLOBAL
)
set_property
(
TARGET apu_neuron PROPERTY IMPORTED_LOCATION
${
APU_NEURON_FILE
}
)
endif
()
if
(
NOT APU_NEURON_ADAPTER_FILE
)
message
(
FATAL_ERROR
"Can not find APU_NEURON_ADAPTER_FILE in
${
APU_DDK_ROOT
}
"
)
else
()
message
(
STATUS
"Found APU NEURON ADAPTER Library:
${
APU_NEURON_ADAPTER_FILE
}
"
)
add_library
(
apu_neuron_adapter SHARED IMPORTED GLOBAL
)
set_property
(
TARGET apu_neuron_adapter PROPERTY IMPORTED_LOCATION
${
APU_NEURON_ADAPTER_FILE
}
)
endif
()
set
(
apu_runtime_libs apu_neuron apu_neuron_adapter CACHE INTERNAL
"apu runtime libs"
)
message
(
STATUS
"
${
apu_runtime_libs
}
"
)
lite/backends/apu/CMakeLists.txt
浏览文件 @
fda90afb
...
@@ -2,4 +2,5 @@ if(NOT LITE_WITH_APU)
...
@@ -2,4 +2,5 @@ if(NOT LITE_WITH_APU)
return
()
return
()
endif
()
endif
()
lite_cc_library
(
device_apu SRCS device.cc
)
lite_cc_library
(
neuron_adapter SRCS neuron_adapter.cc
)
lite_cc_library
(
device_apu SRCS device.cc DEPS neuron_adapter
)
lite/backends/apu/device.cc
浏览文件 @
fda90afb
...
@@ -20,48 +20,19 @@ namespace paddle {
...
@@ -20,48 +20,19 @@ namespace paddle {
namespace
lite
{
namespace
lite
{
namespace
apu
{
namespace
apu
{
inline
void
*
LoadFunc
(
void
*
libHandle
,
const
char
*
name
)
{
NeuronCompilation
*
Device
::
Build
(
NeuronModel
*
model
)
{
CHECK
(
libHandle
!=
nullptr
);
CHECK
(
name
!=
nullptr
);
void
*
fn
=
dlsym
(
libHandle
,
name
);
if
(
fn
==
nullptr
)
{
LOG
(
WARNING
)
<<
"Unable to open Neuron Runtime function ["
<<
name
<<
"] Because "
<<
dlerror
();
}
return
fn
;
}
NeuronCompilation
*
Device
::
Build
(
void
*
libHandle
,
NeuronModel
*
model
)
{
typedef
int
(
*
NeuronCompilation_create
)(
NeuronModel
*
model
,
NeuronCompilation
*
*
compilation
);
typedef
void
(
*
NeuronCompilation_free
)(
NeuronCompilation
*
compilation
);
typedef
int
(
*
NeuronCompilation_finish
)(
NeuronCompilation
*
compilation
);
#define LOAD_FUNCTIONS(libHandle, FUNC_NAME, VARIABLE_NAME) \
FUNC_NAME VARIABLE_NAME = \
reinterpret_cast<FUNC_NAME>(LoadFunc(libHandle, #FUNC_NAME));
LOAD_FUNCTIONS
(
libHandle
,
NeuronCompilation_create
,
neuron_compilation_create
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronCompilation_free
,
neuron_compilation_free
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronCompilation_finish
,
neuron_compilation_finish
)
#undef LOAD_FUNCTIONS
int
neuron_errCode
=
0
;
NeuronCompilation
*
compilation
=
NULL
;
VLOG
(
3
)
<<
"[APU] Compile model"
;
VLOG
(
3
)
<<
"[APU] Compile model"
;
NeuronCompilation
*
compilation
=
NULL
;
neuron_errCode
=
(
*
neuron_compilation_create
)
(
model
,
&
compilation
);
int
neuron_errCode
=
NeuronCompilation_create
(
model
,
&
compilation
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"[APU] create compile failed! "
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"[APU] create compile failed! "
<<
neuron_errCode
;
return
nullptr
;
return
nullptr
;
}
}
neuron_errCode
=
NeuronCompilation_finish
(
compilation
);
neuron_errCode
=
(
*
neuron_compilation_finish
)(
compilation
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"[APU] compile failed! "
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"[APU] compile failed! "
<<
neuron_errCode
;
return
nullptr
;
return
nullptr
;
}
}
VLOG
(
3
)
<<
"[APU] Build done"
;
VLOG
(
3
)
<<
"[APU] Build done"
;
return
compilation
;
return
compilation
;
}
}
...
...
lite/backends/apu/device.h
浏览文件 @
fda90afb
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
#include <string>
#include <string>
#include <unordered_map>
#include <unordered_map>
#include <vector>
#include <vector>
#include "
NeuronAdapter.h" // NOLINT
#include "
lite/backends/apu/neuron_adapter.h"
namespace
paddle
{
namespace
paddle
{
namespace
lite
{
namespace
lite
{
...
@@ -32,7 +32,7 @@ class Device {
...
@@ -32,7 +32,7 @@ class Device {
}
}
Device
()
{}
Device
()
{}
NeuronCompilation
*
Build
(
void
*
libHandle
,
NeuronModel
*
model
);
NeuronCompilation
*
Build
(
NeuronModel
*
model
);
};
};
}
// namespace apu
}
// namespace apu
...
...
lite/backends/apu/neuron_adapter.cc
0 → 100644
浏览文件 @
fda90afb
/* Copyright (c) 2018 PaddlePaddle Authors. 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. */
#include "lite/backends/apu/neuron_adapter.h"
#include <dlfcn.h>
#include <string>
#include <vector>
namespace
paddle
{
namespace
lite
{
NeuronAdapter
*
NeuronAdapter
::
Global
()
{
static
NeuronAdapter
adapter
;
return
&
adapter
;
}
NeuronAdapter
::
NeuronAdapter
()
{
CHECK
(
InitHandle
())
<<
"Fail to initialize the Neuron Adapter library!"
;
InitFunctions
();
}
bool
NeuronAdapter
::
InitHandle
()
{
const
std
::
vector
<
std
::
string
>
paths
=
{
"libneuron_adapter.so"
,
#if defined(__aarch64__)
"/vendor/lib64/libneuron_adapter.so"
,
"/system/lib64/libneuron_adapter.so"
,
"/system/vendor/lib64/libneuron_adapter.so"
,
#else
"/vendor/lib/libneuron_adapter.so"
,
"/system/lib/libneuron_adapter.so"
,
"/system/vendor/lib/libneuron_adapter.so"
,
#endif
};
std
::
string
target_lib
=
"Unknown"
;
for
(
auto
path
:
paths
)
{
handle_
=
dlopen
(
path
.
c_str
(),
RTLD_LAZY
);
if
(
handle_
!=
nullptr
)
{
target_lib
=
path
;
break
;
}
}
VLOG
(
4
)
<<
"Load the Neuron Adapter library from "
<<
target_lib
;
if
(
handle_
!=
nullptr
)
{
return
true
;
}
else
{
return
false
;
}
}
void
NeuronAdapter
::
InitFunctions
()
{
CHECK
(
handle_
!=
nullptr
)
<<
"The library handle can't be null!"
;
#define PADDLE_DLSYM(neuron_adapter_func) \
do { \
neuron_adapter_func##_ = \
(neuron_adapter_func##_Type)dlsym(handle_, #neuron_adapter_func); \
if (neuron_adapter_func##_ == nullptr) { \
LOG(FATAL) << "Cannot find the " << #neuron_adapter_func \
<< " symbol in libneuron_adapter.so!"; \
break; \
} \
VLOG(4) << "Loaded the " << #neuron_adapter_func \
<< " symbol successfully."; \
} while (false)
PADDLE_DLSYM
(
Neuron_getVersion
);
PADDLE_DLSYM
(
NeuronModel_create
);
PADDLE_DLSYM
(
NeuronModel_free
);
PADDLE_DLSYM
(
NeuronModel_finish
);
PADDLE_DLSYM
(
NeuronModel_addOperand
);
PADDLE_DLSYM
(
NeuronModel_setOperandValue
);
PADDLE_DLSYM
(
NeuronModel_setOperandSymmPerChannelQuantParams
);
PADDLE_DLSYM
(
NeuronModel_addOperation
);
PADDLE_DLSYM
(
NeuronModel_identifyInputsAndOutputs
);
PADDLE_DLSYM
(
NeuronCompilation_create
);
PADDLE_DLSYM
(
NeuronCompilation_free
);
PADDLE_DLSYM
(
NeuronCompilation_finish
);
PADDLE_DLSYM
(
NeuronExecution_create
);
PADDLE_DLSYM
(
NeuronExecution_free
);
PADDLE_DLSYM
(
NeuronExecution_setInput
);
PADDLE_DLSYM
(
NeuronExecution_setOutput
);
PADDLE_DLSYM
(
NeuronExecution_compute
);
#undef PADDLE_DLSYM
}
}
// namespace lite
}
// namespace paddle
int
Neuron_getVersion
(
uint32_t
*
version
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
Neuron_getVersion
()(
version
);
}
int
NeuronModel_create
(
NeuronModel
**
model
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_create
()(
model
);
}
void
NeuronModel_free
(
NeuronModel
*
model
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_free
()(
model
);
}
int
NeuronModel_finish
(
NeuronModel
*
model
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_finish
()(
model
);
}
int
NeuronModel_addOperand
(
NeuronModel
*
model
,
const
NeuronOperandType
*
type
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_addOperand
()(
model
,
type
);
}
int
NeuronModel_setOperandValue
(
NeuronModel
*
model
,
int32_t
index
,
const
void
*
buffer
,
size_t
length
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_setOperandValue
()(
model
,
index
,
buffer
,
length
);
}
int
NeuronModel_setOperandSymmPerChannelQuantParams
(
NeuronModel
*
model
,
int32_t
index
,
const
NeuronSymmPerChannelQuantParams
*
channelQuant
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_setOperandSymmPerChannelQuantParams
()(
model
,
index
,
channelQuant
);
}
int
NeuronModel_addOperation
(
NeuronModel
*
model
,
NeuronOperationType
type
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_addOperation
()(
model
,
type
,
inputCount
,
inputs
,
outputCount
,
outputs
);
}
int
NeuronModel_identifyInputsAndOutputs
(
NeuronModel
*
model
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronModel_identifyInputsAndOutputs
()(
model
,
inputCount
,
inputs
,
outputCount
,
outputs
);
}
int
NeuronCompilation_create
(
NeuronModel
*
model
,
NeuronCompilation
**
compilation
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronCompilation_create
()(
model
,
compilation
);
}
void
NeuronCompilation_free
(
NeuronCompilation
*
compilation
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronCompilation_free
()(
compilation
);
}
int
NeuronCompilation_finish
(
NeuronCompilation
*
compilation
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronCompilation_finish
()(
compilation
);
}
int
NeuronExecution_create
(
NeuronCompilation
*
compilation
,
NeuronExecution
**
execution
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronExecution_create
()(
compilation
,
execution
);
}
void
NeuronExecution_free
(
NeuronExecution
*
execution
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronExecution_free
()(
execution
);
}
int
NeuronExecution_setInput
(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
const
void
*
buffer
,
size_t
length
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronExecution_setInput
()(
execution
,
index
,
type
,
buffer
,
length
);
}
int
NeuronExecution_setOutput
(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
void
*
buffer
,
size_t
length
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronExecution_setOutput
()(
execution
,
index
,
type
,
buffer
,
length
);
}
int
NeuronExecution_compute
(
NeuronExecution
*
execution
)
{
return
paddle
::
lite
::
NeuronAdapter
::
Global
()
->
NeuronExecution_compute
()(
execution
);
}
lite/backends/apu/neuron_adapter.h
0 → 100644
浏览文件 @
fda90afb
/* Copyright (c) 2018 PaddlePaddle Authors. 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. */
#pragma once
#include "NeuronAdapter.h" // NOLINT
#include "lite/utils/cp_logging.h"
namespace
paddle
{
namespace
lite
{
class
NeuronAdapter
final
{
public:
static
NeuronAdapter
*
Global
();
// Platform APIs
using
Neuron_getVersion_Type
=
int
(
*
)(
uint32_t
*
);
using
NeuronModel_create_Type
=
int
(
*
)(
NeuronModel
**
);
using
NeuronModel_free_Type
=
void
(
*
)(
NeuronModel
*
);
using
NeuronModel_finish_Type
=
int
(
*
)(
NeuronModel
*
);
using
NeuronModel_addOperand_Type
=
int
(
*
)(
NeuronModel
*
,
const
NeuronOperandType
*
);
using
NeuronModel_setOperandValue_Type
=
int
(
*
)(
NeuronModel
*
,
int32_t
,
const
void
*
,
size_t
);
using
NeuronModel_setOperandSymmPerChannelQuantParams_Type
=
int
(
*
)(
NeuronModel
*
,
int32_t
,
const
NeuronSymmPerChannelQuantParams
*
);
using
NeuronModel_addOperation_Type
=
int
(
*
)(
NeuronModel
*
,
NeuronOperationType
,
uint32_t
,
const
uint32_t
*
,
uint32_t
,
const
uint32_t
*
);
using
NeuronModel_identifyInputsAndOutputs_Type
=
int
(
*
)(
NeuronModel
*
,
uint32_t
,
const
uint32_t
*
,
uint32_t
,
const
uint32_t
*
);
using
NeuronCompilation_create_Type
=
int
(
*
)(
NeuronModel
*
,
NeuronCompilation
**
);
using
NeuronCompilation_free_Type
=
void
(
*
)(
NeuronCompilation
*
);
using
NeuronCompilation_finish_Type
=
int
(
*
)(
NeuronCompilation
*
);
using
NeuronExecution_create_Type
=
int
(
*
)(
NeuronCompilation
*
,
NeuronExecution
**
);
using
NeuronExecution_free_Type
=
void
(
*
)(
NeuronExecution
*
);
using
NeuronExecution_setInput_Type
=
int
(
*
)(
NeuronExecution
*
,
int32_t
,
const
NeuronOperandType
*
,
const
void
*
,
size_t
);
using
NeuronExecution_setOutput_Type
=
int
(
*
)(
NeuronExecution
*
,
int32_t
,
const
NeuronOperandType
*
,
void
*
,
size_t
);
using
NeuronExecution_compute_Type
=
int
(
*
)(
NeuronExecution
*
);
Neuron_getVersion_Type
Neuron_getVersion
()
{
CHECK
(
Neuron_getVersion_
!=
nullptr
)
<<
"Cannot load Neuron_getVersion!"
;
return
Neuron_getVersion_
;
}
NeuronModel_create_Type
NeuronModel_create
()
{
CHECK
(
NeuronModel_create_
!=
nullptr
)
<<
"Cannot load NeuronModel_create!"
;
return
NeuronModel_create_
;
}
NeuronModel_free_Type
NeuronModel_free
()
{
CHECK
(
NeuronModel_free_
!=
nullptr
)
<<
"Cannot load NeuronModel_free!"
;
return
NeuronModel_free_
;
}
NeuronModel_finish_Type
NeuronModel_finish
()
{
CHECK
(
NeuronModel_finish_
!=
nullptr
)
<<
"Cannot load NeuronModel_finish!"
;
return
NeuronModel_finish_
;
}
NeuronModel_addOperand_Type
NeuronModel_addOperand
()
{
CHECK
(
NeuronModel_addOperand_
!=
nullptr
)
<<
"Cannot load NeuronModel_addOperand!"
;
return
NeuronModel_addOperand_
;
}
NeuronModel_setOperandValue_Type
NeuronModel_setOperandValue
()
{
CHECK
(
NeuronModel_setOperandValue_
!=
nullptr
)
<<
"Cannot load NeuronModel_setOperandValue!"
;
return
NeuronModel_setOperandValue_
;
}
NeuronModel_setOperandSymmPerChannelQuantParams_Type
NeuronModel_setOperandSymmPerChannelQuantParams
()
{
CHECK
(
NeuronModel_setOperandSymmPerChannelQuantParams_
!=
nullptr
)
<<
"Cannot load NeuronModel_setOperandSymmPerChannelQuantParams!"
;
return
NeuronModel_setOperandSymmPerChannelQuantParams_
;
}
NeuronModel_addOperation_Type
NeuronModel_addOperation
()
{
CHECK
(
NeuronModel_addOperation_
!=
nullptr
)
<<
"Cannot load NeuronModel_addOperation!"
;
return
NeuronModel_addOperation_
;
}
NeuronModel_identifyInputsAndOutputs_Type
NeuronModel_identifyInputsAndOutputs
()
{
CHECK
(
NeuronModel_identifyInputsAndOutputs_
!=
nullptr
)
<<
"Cannot load NeuronModel_identifyInputsAndOutputs!"
;
return
NeuronModel_identifyInputsAndOutputs_
;
}
NeuronCompilation_create_Type
NeuronCompilation_create
()
{
CHECK
(
NeuronCompilation_create_
!=
nullptr
)
<<
"Cannot load NeuronCompilation_create!"
;
return
NeuronCompilation_create_
;
}
NeuronCompilation_free_Type
NeuronCompilation_free
()
{
CHECK
(
NeuronCompilation_free_
!=
nullptr
)
<<
"Cannot load NeuronCompilation_free!"
;
return
NeuronCompilation_free_
;
}
NeuronCompilation_finish_Type
NeuronCompilation_finish
()
{
CHECK
(
NeuronCompilation_finish_
!=
nullptr
)
<<
"Cannot load NeuronCompilation_finish!"
;
return
NeuronCompilation_finish_
;
}
NeuronExecution_create_Type
NeuronExecution_create
()
{
CHECK
(
NeuronExecution_create_
!=
nullptr
)
<<
"Cannot load NeuronExecution_create!"
;
return
NeuronExecution_create_
;
}
NeuronExecution_free_Type
NeuronExecution_free
()
{
CHECK
(
NeuronExecution_free_
!=
nullptr
)
<<
"Cannot load NeuronExecution_free!"
;
return
NeuronExecution_free_
;
}
NeuronExecution_setInput_Type
NeuronExecution_setInput
()
{
CHECK
(
NeuronExecution_setInput_
!=
nullptr
)
<<
"Cannot loadcl NeuronExecution_setInput!"
;
return
NeuronExecution_setInput_
;
}
NeuronExecution_setOutput_Type
NeuronExecution_setOutput
()
{
CHECK
(
NeuronExecution_setOutput_
!=
nullptr
)
<<
"Cannot load NeuronExecution_setOutput!"
;
return
NeuronExecution_setOutput_
;
}
NeuronExecution_compute_Type
NeuronExecution_compute
()
{
CHECK
(
NeuronExecution_compute_
!=
nullptr
)
<<
"Cannot load NeuronExecution_compute!"
;
return
NeuronExecution_compute_
;
}
private:
NeuronAdapter
();
NeuronAdapter
(
const
NeuronAdapter
&
)
=
delete
;
NeuronAdapter
&
operator
=
(
const
NeuronAdapter
&
)
=
delete
;
bool
InitHandle
();
void
InitFunctions
();
void
*
handle_
{
nullptr
};
Neuron_getVersion_Type
Neuron_getVersion_
{
nullptr
};
NeuronModel_create_Type
NeuronModel_create_
{
nullptr
};
NeuronModel_free_Type
NeuronModel_free_
{
nullptr
};
NeuronModel_finish_Type
NeuronModel_finish_
{
nullptr
};
NeuronModel_addOperand_Type
NeuronModel_addOperand_
{
nullptr
};
NeuronModel_setOperandValue_Type
NeuronModel_setOperandValue_
{
nullptr
};
NeuronModel_setOperandSymmPerChannelQuantParams_Type
NeuronModel_setOperandSymmPerChannelQuantParams_
{
nullptr
};
NeuronModel_addOperation_Type
NeuronModel_addOperation_
{
nullptr
};
NeuronModel_identifyInputsAndOutputs_Type
NeuronModel_identifyInputsAndOutputs_
{
nullptr
};
NeuronCompilation_create_Type
NeuronCompilation_create_
{
nullptr
};
NeuronCompilation_free_Type
NeuronCompilation_free_
{
nullptr
};
NeuronCompilation_finish_Type
NeuronCompilation_finish_
{
nullptr
};
NeuronExecution_create_Type
NeuronExecution_create_
{
nullptr
};
NeuronExecution_free_Type
NeuronExecution_free_
{
nullptr
};
NeuronExecution_setInput_Type
NeuronExecution_setInput_
{
nullptr
};
NeuronExecution_setOutput_Type
NeuronExecution_setOutput_
{
nullptr
};
NeuronExecution_compute_Type
NeuronExecution_compute_
{
nullptr
};
};
}
// namespace lite
}
// namespace paddle
lite/kernels/apu/CMakeLists.txt
浏览文件 @
fda90afb
add_subdirectory
(
bridges
)
add_subdirectory
(
bridges
)
add_kernel
(
subgraph_compute_apu APU basic SRCS subgraph_compute.cc DEPS
${
lite_kernel_deps
}
device_apu subgraph_bridge_engine
${
apu_subgraph_bridges
}
)
add_kernel
(
subgraph_compute_apu APU basic SRCS subgraph_compute.cc DEPS
${
lite_kernel_deps
}
device_apu
neuron_adapter
subgraph_bridge_engine
${
apu_subgraph_bridges
}
)
lite/kernels/apu/bridges/CMakeLists.txt
浏览文件 @
fda90afb
...
@@ -3,7 +3,7 @@ if(NOT LITE_WITH_APU)
...
@@ -3,7 +3,7 @@ if(NOT LITE_WITH_APU)
endif
()
endif
()
lite_cc_library
(
subgraph_bridge_utility_apu SRCS utility.cc DEPS tensor
)
lite_cc_library
(
subgraph_bridge_utility_apu SRCS utility.cc DEPS tensor
neuron_adapter
)
lite_cc_library
(
subgraph_bridge_graph_apu SRCS graph.cc DEPS subgraph_bridge_utility_apu
)
lite_cc_library
(
subgraph_bridge_graph_apu SRCS graph.cc DEPS subgraph_bridge_utility_apu
)
set
(
apu_subgraph_bridge_deps subgraph_bridge_registry subgraph_bridge_utility_apu subgraph_bridge_graph_apu
)
set
(
apu_subgraph_bridge_deps subgraph_bridge_registry subgraph_bridge_utility_apu subgraph_bridge_graph_apu
)
...
...
lite/kernels/apu/bridges/conv_op.cc
浏览文件 @
fda90afb
...
@@ -33,16 +33,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -33,16 +33,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
auto
op_type
=
op_info
->
Type
();
auto
op_type
=
op_info
->
Type
();
auto
scope
=
op
->
scope
();
auto
scope
=
op
->
scope
();
int
neuron_errCode
;
int
neuron_errCode
;
VLOG
(
3
)
<<
"[APU] Converting ["
<<
op_type
<<
"]"
;
VLOG
(
3
)
<<
"[APU] Converting ["
<<
op_type
<<
"]"
;
auto
libHandle
=
graph
->
libHandle
();
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperand
,
neuron_model_addOperand
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandValue
,
neuron_model_setOperandValue
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperation
,
neuron_model_addOperation
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandSymmPerChannelQuantParams
,
neuron_model_setOperandSymmPerChannelQuantParams
)
// Get input and output vars and op attributes
// Get input and output vars and op attributes
auto
input_name
=
op_info
->
Input
(
"Input"
).
front
();
auto
input_name
=
op_info
->
Input
(
"Input"
).
front
();
...
@@ -167,7 +158,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -167,7 +158,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
input_node
=
graph
->
Get
(
input_name
);
input_node
=
graph
->
Get
(
input_name
);
if
(
input_node
==
nullptr
)
return
subgraph
::
FAILED
;
if
(
input_node
==
nullptr
)
return
subgraph
::
FAILED
;
}
else
{
}
else
{
(
*
neuron_model_addOperand
)
(
model
,
&
inType
);
// input
NeuronModel_addOperand
(
model
,
&
inType
);
// input
input_node
=
graph
->
Add
(
input_name
,
dims_in
);
input_node
=
graph
->
Add
(
input_name
,
dims_in
);
}
}
}
}
...
@@ -253,7 +244,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -253,7 +244,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
std
::
shared_ptr
<
Node
>
filter_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
filter_node
=
nullptr
;
if
(
1
==
weight_scale
.
size
())
{
if
(
1
==
weight_scale
.
size
())
{
(
*
neuron_model_addOperand
)
(
model
,
&
filterType
);
// 1: filter
NeuronModel_addOperand
(
model
,
&
filterType
);
// 1: filter
filter_node
=
graph
->
Add
(
filter_name
,
dims_filter
);
filter_node
=
graph
->
Add
(
filter_name
,
dims_filter
);
VLOG
(
3
)
<<
"filter node idx: "
<<
filter_node
->
index
()
<<
"w_scale[0]"
VLOG
(
3
)
<<
"filter node idx: "
<<
filter_node
->
index
()
<<
"w_scale[0]"
<<
weight_scale
[
0
]
<<
": filterType: "
<<
filterType
.
dimensions
[
0
]
<<
weight_scale
[
0
]
<<
": filterType: "
<<
filterType
.
dimensions
[
0
]
...
@@ -262,14 +253,14 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -262,14 +253,14 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
memcpy
(
filter
->
mutable_data
<
int8_t
>
(),
memcpy
(
filter
->
mutable_data
<
int8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
filter
->
memory_size
());
filter
->
memory_size
());
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
filter_node
->
index
(),
filter
->
raw_data
(),
filter
->
memory_size
());
model
,
filter_node
->
index
(),
filter
->
raw_data
(),
filter
->
memory_size
());
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Set filter operand value fail:"
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"Set filter operand value fail:"
<<
neuron_errCode
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
}
}
}
else
{
}
else
{
(
*
neuron_model_addOperand
)
(
model
,
&
channelFilterType
);
// 1: filter
NeuronModel_addOperand
(
model
,
&
channelFilterType
);
// 1: filter
filter_node
=
graph
->
Add
(
filter_name
,
dims_filter
);
filter_node
=
graph
->
Add
(
filter_name
,
dims_filter
);
VLOG
(
3
)
<<
"chennel filter node idx: "
<<
filter_node
->
index
()
VLOG
(
3
)
<<
"chennel filter node idx: "
<<
filter_node
->
index
()
<<
" ,scale_count:"
<<
weight_scale
.
size
()
<<
" ,scale_count:"
<<
weight_scale
.
size
()
...
@@ -281,13 +272,13 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -281,13 +272,13 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
memcpy
(
filter
->
mutable_data
<
int8_t
>
(),
memcpy
(
filter
->
mutable_data
<
int8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
filter
->
memory_size
());
filter
->
memory_size
());
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
filter_node
->
index
(),
filter
->
raw_data
(),
filter
->
memory_size
());
model
,
filter_node
->
index
(),
filter
->
raw_data
(),
filter
->
memory_size
());
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Set filter operand value fail:"
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"Set filter operand value fail:"
<<
neuron_errCode
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
}
}
neuron_errCode
=
(
*
neuron_model_setOperandSymmPerChannelQuantParams
)
(
neuron_errCode
=
NeuronModel_setOperandSymmPerChannelQuantParams
(
model
,
filter_node
->
index
(),
&
symmPerChannelQuantParams
);
model
,
filter_node
->
index
(),
&
symmPerChannelQuantParams
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Set per channel filter params fail:"
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"Set per channel filter params fail:"
<<
neuron_errCode
;
...
@@ -315,7 +306,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -315,7 +306,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
for
(
int
i
=
0
;
i
<
bias_dims
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
bias_dims
.
size
();
i
++
)
dims_bias
.
push_back
(
bias_dims
[
i
]);
dims_bias
.
push_back
(
bias_dims
[
i
]);
biasType
.
dimensions
=
&
dims_bias
[
0
];
biasType
.
dimensions
=
&
dims_bias
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
biasType
);
// 2: bias
NeuronModel_addOperand
(
model
,
&
biasType
);
// 2: bias
bias_node
=
graph
->
Add
(
bias_name
,
dims_bias
);
bias_node
=
graph
->
Add
(
bias_name
,
dims_bias
);
VLOG
(
3
)
<<
"node idx"
<<
bias_node
->
index
()
<<
": Bias name: "
<<
bias_name
VLOG
(
3
)
<<
"node idx"
<<
bias_node
->
index
()
<<
": Bias name: "
<<
bias_name
<<
" ,bias scale: "
<<
biasType
.
scale
<<
" ,bias scale: "
<<
biasType
.
scale
...
@@ -324,7 +315,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -324,7 +315,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
biasType
.
dimensionCount
=
1
;
biasType
.
dimensionCount
=
1
;
dims_bias
=
{(
uint32_t
)
output_dims
[
1
]};
dims_bias
=
{(
uint32_t
)
output_dims
[
1
]};
biasType
.
dimensions
=
&
dims_bias
[
0
];
biasType
.
dimensions
=
&
dims_bias
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
biasType
);
// 2: bias
NeuronModel_addOperand
(
model
,
&
biasType
);
// 2: bias
bias_node
=
graph
->
Add
(
filter_name
+
"_default_bias"
,
dims_bias
);
bias_node
=
graph
->
Add
(
filter_name
+
"_default_bias"
,
dims_bias
);
VLOG
(
3
)
<<
"node idx"
<<
bias_node
->
index
()
<<
": Bias name: default_bias "
VLOG
(
3
)
<<
"node idx"
<<
bias_node
->
index
()
<<
": Bias name: default_bias "
<<
" ,bias scale: "
<<
biasType
.
scale
<<
" ,bias scale: "
<<
biasType
.
scale
...
@@ -337,37 +328,37 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -337,37 +328,37 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
std
::
vector
<
uint32_t
>
dims_int32
=
{
1
};
std
::
vector
<
uint32_t
>
dims_int32
=
{
1
};
std
::
shared_ptr
<
Node
>
paddingL_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingL_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 3: padding left
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 3: padding left
paddingL_node
=
graph
->
Add
(
filter_name
+
"_padding_left"
,
dims_int32
);
paddingL_node
=
graph
->
Add
(
filter_name
+
"_padding_left"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingR_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingR_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 4: padding right
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 4: padding right
paddingR_node
=
graph
->
Add
(
filter_name
+
"_padding_right"
,
dims_int32
);
paddingR_node
=
graph
->
Add
(
filter_name
+
"_padding_right"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingT_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingT_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 5: padding top
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 5: padding top
paddingT_node
=
graph
->
Add
(
filter_name
+
"_padding_top"
,
dims_int32
);
paddingT_node
=
graph
->
Add
(
filter_name
+
"_padding_top"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingB_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingB_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 6: padding bottom
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 6: padding bottom
paddingB_node
=
graph
->
Add
(
filter_name
+
"_padding_bottom"
,
dims_int32
);
paddingB_node
=
graph
->
Add
(
filter_name
+
"_padding_bottom"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
strideW_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
strideW_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 7: stride width
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 7: stride width
strideW_node
=
graph
->
Add
(
filter_name
+
"_stride_width"
,
dims_int32
);
strideW_node
=
graph
->
Add
(
filter_name
+
"_stride_width"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
strideH_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
strideH_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 8: stride height
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 8: stride height
strideH_node
=
graph
->
Add
(
filter_name
+
"_stride_height"
,
dims_int32
);
strideH_node
=
graph
->
Add
(
filter_name
+
"_stride_height"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
dm_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
dm_node
=
nullptr
;
if
(
is_depthwise_mode
)
{
if
(
is_depthwise_mode
)
{
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 9: depthwise multiplier
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 9: depthwise multiplier
dm_node
=
graph
->
Add
(
filter_name
+
"_dm"
,
dims_int32
);
dm_node
=
graph
->
Add
(
filter_name
+
"_dm"
,
dims_int32
);
}
}
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 9/10: fuse
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 9/10: fuse
fuse_node
=
graph
->
Add
(
filter_name
+
"_fuse"
,
dims_int32
);
fuse_node
=
graph
->
Add
(
filter_name
+
"_fuse"
,
dims_int32
);
// Add output tensor type
// Add output tensor type
...
@@ -390,10 +381,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -390,10 +381,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
}
else
{
}
else
{
// add output operand
// add output operand
if
(
graph
->
IsOutput
(
output_name
))
{
if
(
graph
->
IsOutput
(
output_name
))
{
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// output
NeuronModel_addOperand
(
model
,
&
outType
);
// output
output_node
=
graph
->
Add
(
"transpose_"
+
output_name
,
dims_out
);
output_node
=
graph
->
Add
(
"transpose_"
+
output_name
,
dims_out
);
}
else
{
}
else
{
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// output
NeuronModel_addOperand
(
model
,
&
outType
);
// output
output_node
=
graph
->
Add
(
output_name
,
dims_out
);
output_node
=
graph
->
Add
(
output_name
,
dims_out
);
}
}
}
}
...
@@ -415,7 +406,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -415,7 +406,7 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
VLOG
(
3
)
<<
"int32_bias_data: "
<<
int32_bias_data
[
0
]
<<
" : "
VLOG
(
3
)
<<
"int32_bias_data: "
<<
int32_bias_data
[
0
]
<<
" : "
<<
int32_bias_data
[
1
]
<<
" : "
<<
int32_bias_data
[
2
]
<<
" : "
<<
int32_bias_data
[
1
]
<<
" : "
<<
int32_bias_data
[
2
]
<<
" : "
<<
int32_bias_data
[
3
];
<<
int32_bias_data
[
3
];
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
bias_node
->
index
(),
bias
->
raw_data
(),
bias
->
memory_size
());
model
,
bias_node
->
index
(),
bias
->
raw_data
(),
bias
->
memory_size
());
}
else
{
}
else
{
auto
int32_bias
=
std
::
make_shared
<
Tensor
>
();
auto
int32_bias
=
std
::
make_shared
<
Tensor
>
();
...
@@ -423,10 +414,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -423,10 +414,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
int32_bias
->
mutable_data
<
int32_t
>
();
int32_bias
->
mutable_data
<
int32_t
>
();
VLOG
(
3
)
<<
"bais_default: "
<<
int32_bias
->
memory_size
();
VLOG
(
3
)
<<
"bais_default: "
<<
int32_bias
->
memory_size
();
memset
(
int32_bias
->
mutable_data
<
int32_t
>
(),
0
,
int32_bias
->
memory_size
());
memset
(
int32_bias
->
mutable_data
<
int32_t
>
(),
0
,
int32_bias
->
memory_size
());
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
model
,
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
bias_node
->
index
(),
bias_node
->
index
(),
int32_bias
->
raw_data
(),
int32_bias
->
raw_data
(),
int32_bias
->
memory_size
());
int32_bias
->
memory_size
());
bias_node
->
set_data
(
int32_bias
);
bias_node
->
set_data
(
int32_bias
);
}
}
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
...
@@ -439,16 +430,16 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -439,16 +430,16 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
// Add padding value
// Add padding value
int32_t
padding_val
[
1
];
int32_t
padding_val
[
1
];
padding_val
[
0
]
=
paddings
[
2
];
padding_val
[
0
]
=
paddings
[
2
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingL_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingL_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
3
];
padding_val
[
0
]
=
paddings
[
3
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingR_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingR_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
0
];
padding_val
[
0
]
=
paddings
[
0
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingT_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingT_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
1
];
padding_val
[
0
]
=
paddings
[
1
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingB_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingB_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
VLOG
(
3
)
<<
" stride width:"
<<
strides
[
1
]
<<
" height:"
<<
strides
[
0
];
VLOG
(
3
)
<<
" stride width:"
<<
strides
[
1
]
<<
" height:"
<<
strides
[
0
];
...
@@ -456,10 +447,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -456,10 +447,10 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
// Add Stride
// Add Stride
int32_t
stride_val
[
1
];
int32_t
stride_val
[
1
];
stride_val
[
0
]
=
strides
[
1
];
// width
stride_val
[
0
]
=
strides
[
1
];
// width
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
strideW_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
model
,
strideW_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
stride_val
[
0
]
=
strides
[
0
];
// height
stride_val
[
0
]
=
strides
[
0
];
// height
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
strideH_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
model
,
strideH_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
// Add fuse
// Add fuse
...
@@ -478,12 +469,12 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -478,12 +469,12 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
if
(
is_depthwise_mode
)
{
if
(
is_depthwise_mode
)
{
int32_t
dm
=
oc
/
ic
;
int32_t
dm
=
oc
/
ic
;
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
dm_node
->
index
(),
&
dm
,
sizeof
(
int32_t
)
*
1
);
model
,
dm_node
->
index
(),
&
dm
,
sizeof
(
int32_t
)
*
1
);
VLOG
(
3
)
<<
"depthwise multiplier:"
<<
dm
;
VLOG
(
3
)
<<
"depthwise multiplier:"
<<
dm
;
// Depthwise conv
// Depthwise conv
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
std
::
vector
<
uint32_t
>
addInIndex
=
{
std
::
vector
<
uint32_t
>
addInIndex
=
{
input_node
->
index
(),
// 0: input
input_node
->
index
(),
// 0: input
...
@@ -499,14 +490,14 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -499,14 +490,14 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
fuse_node
->
index
()};
// 10 : fuse
fuse_node
->
index
()};
// 10 : fuse
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_DEPTHWISE_CONV_2D
,
NEURON_DEPTHWISE_CONV_2D
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
}
else
{
}
else
{
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
std
::
vector
<
uint32_t
>
addInIndex
=
{
std
::
vector
<
uint32_t
>
addInIndex
=
{
input_node
->
index
(),
// 0: input
input_node
->
index
(),
// 0: input
...
@@ -521,12 +512,12 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -521,12 +512,12 @@ int ConvConverter(void* ctx, OpLite* op, KernelBase* kernel) {
fuse_node
->
index
()};
// 9: fuse
fuse_node
->
index
()};
// 9: fuse
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_CONV_2D
,
NEURON_CONV_2D
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
}
}
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
...
...
lite/kernels/apu/bridges/fc_op.cc
浏览文件 @
fda90afb
...
@@ -31,12 +31,6 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -31,12 +31,6 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
auto
scope
=
op
->
scope
();
auto
scope
=
op
->
scope
();
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"]"
;
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"]"
;
auto
libHandle
=
graph
->
libHandle
();
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperand
,
neuron_model_addOperand
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandValue
,
neuron_model_setOperandValue
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperation
,
neuron_model_addOperation
)
auto
input_name
=
op_info
->
Input
(
"Input"
).
front
();
auto
input_name
=
op_info
->
Input
(
"Input"
).
front
();
auto
input
=
scope
->
FindMutableTensor
(
input_name
);
auto
input
=
scope
->
FindMutableTensor
(
input_name
);
auto
input_dims
=
input
->
dims
();
auto
input_dims
=
input
->
dims
();
...
@@ -95,7 +89,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -95,7 +89,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
VLOG
(
3
)
<<
"Graph has "
<<
input_name
<<
",index: "
<<
in_node
->
index
();
VLOG
(
3
)
<<
"Graph has "
<<
input_name
<<
",index: "
<<
in_node
->
index
();
}
else
{
}
else
{
// add input operand
// add input operand
(
*
neuron_model_addOperand
)
(
model
,
&
inType
);
// 0: input
NeuronModel_addOperand
(
model
,
&
inType
);
// 0: input
in_node
=
graph
->
Add
(
input_name
,
dims_in
);
in_node
=
graph
->
Add
(
input_name
,
dims_in
);
}
}
VLOG
(
3
)
<<
"input_scale: "
<<
input_scale
VLOG
(
3
)
<<
"input_scale: "
<<
input_scale
...
@@ -110,7 +104,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -110,7 +104,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
wType
.
dimensionCount
=
w_dims
.
size
();
wType
.
dimensionCount
=
w_dims
.
size
();
std
::
vector
<
uint32_t
>
dims_w
=
{(
uint32_t
)
w_dims
[
1
],
(
uint32_t
)
w_dims
[
0
]};
std
::
vector
<
uint32_t
>
dims_w
=
{(
uint32_t
)
w_dims
[
1
],
(
uint32_t
)
w_dims
[
0
]};
wType
.
dimensions
=
&
dims_w
[
0
];
wType
.
dimensions
=
&
dims_w
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
wType
);
// 1: weight
NeuronModel_addOperand
(
model
,
&
wType
);
// 1: weight
std
::
shared_ptr
<
Node
>
w_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
w_node
=
nullptr
;
w_node
=
graph
->
Add
(
w_name
,
dims_w
);
w_node
=
graph
->
Add
(
w_name
,
dims_w
);
VLOG
(
3
)
<<
"w_scale size: "
<<
w_scale
.
size
()
<<
",w_scale: "
<<
w_scale
[
0
]
VLOG
(
3
)
<<
"w_scale size: "
<<
w_scale
.
size
()
<<
",w_scale: "
<<
w_scale
[
0
]
...
@@ -132,7 +126,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -132,7 +126,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
biasType
.
dimensionCount
=
bias_dims
.
size
();
biasType
.
dimensionCount
=
bias_dims
.
size
();
std
::
vector
<
uint32_t
>
dims_bias
=
{(
uint32_t
)
bias_dims
[
0
]};
std
::
vector
<
uint32_t
>
dims_bias
=
{(
uint32_t
)
bias_dims
[
0
]};
biasType
.
dimensions
=
&
dims_bias
[
0
];
biasType
.
dimensions
=
&
dims_bias
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
biasType
);
// 2: bias
NeuronModel_addOperand
(
model
,
&
biasType
);
// 2: bias
bias_node
=
graph
->
Add
(
bias_name
,
dims_bias
);
bias_node
=
graph
->
Add
(
bias_name
,
dims_bias
);
VLOG
(
3
)
<<
"Bias name: "
<<
bias_name
<<
", bias dims: "
<<
bias_dims
VLOG
(
3
)
<<
"Bias name: "
<<
bias_name
<<
", bias dims: "
<<
bias_dims
<<
", bias scale: "
<<
biasType
.
scale
<<
", bias scale: "
<<
biasType
.
scale
...
@@ -141,7 +135,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -141,7 +135,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
biasType
.
dimensionCount
=
1
;
biasType
.
dimensionCount
=
1
;
std
::
vector
<
uint32_t
>
dims_bias
=
{(
uint32_t
)
n
};
std
::
vector
<
uint32_t
>
dims_bias
=
{(
uint32_t
)
n
};
biasType
.
dimensions
=
&
dims_bias
[
0
];
biasType
.
dimensions
=
&
dims_bias
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
biasType
);
// 2: bias
NeuronModel_addOperand
(
model
,
&
biasType
);
// 2: bias
bias_node
=
graph
->
Add
(
w_name
+
"_default_bias"
,
dims_bias
);
bias_node
=
graph
->
Add
(
w_name
+
"_default_bias"
,
dims_bias
);
}
}
...
@@ -150,7 +144,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -150,7 +144,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
fuseType
.
type
=
NEURON_INT32
;
fuseType
.
type
=
NEURON_INT32
;
fuseType
.
dimensionCount
=
0
;
fuseType
.
dimensionCount
=
0
;
std
::
vector
<
uint32_t
>
dims_int32
=
{
0
};
std
::
vector
<
uint32_t
>
dims_int32
=
{
0
};
(
*
neuron_model_addOperand
)
(
model
,
&
fuseType
);
// 3: fuse
NeuronModel_addOperand
(
model
,
&
fuseType
);
// 3: fuse
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
fuse_node
=
graph
->
Add
(
w_name
+
"_fuse"
,
dims_int32
);
fuse_node
=
graph
->
Add
(
w_name
+
"_fuse"
,
dims_int32
);
...
@@ -165,7 +159,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -165,7 +159,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
VLOG
(
3
)
<<
"out_scale: "
<<
out_scale
VLOG
(
3
)
<<
"out_scale: "
<<
out_scale
<<
", outType: "
<<
outType
.
dimensions
[
0
]
<<
" : "
<<
", outType: "
<<
outType
.
dimensions
[
0
]
<<
" : "
<<
outType
.
dimensions
[
1
];
<<
outType
.
dimensions
[
1
];
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// output
NeuronModel_addOperand
(
model
,
&
outType
);
// output
std
::
shared_ptr
<
Node
>
out_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
out_node
=
nullptr
;
out_node
=
graph
->
Add
(
out_name
,
dims_out
);
out_node
=
graph
->
Add
(
out_name
,
dims_out
);
...
@@ -181,7 +175,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -181,7 +175,7 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
memcpy
(
w
->
mutable_data
<
int8_t
>
(),
memcpy
(
w
->
mutable_data
<
int8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
transpose_filter
.
mutable_data
<
uint8_t
>
(),
w
->
memory_size
());
w
->
memory_size
());
int
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
int
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
w_node
->
index
(),
w
->
raw_data
(),
w
->
memory_size
());
model
,
w_node
->
index
(),
w
->
raw_data
(),
w
->
memory_size
());
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Set W operand value fail:"
<<
neuron_errCode
LOG
(
WARNING
)
<<
"Set W operand value fail:"
<<
neuron_errCode
...
@@ -200,10 +194,10 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -200,10 +194,10 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
VLOG
(
3
)
<<
int32_bias_data
[
0
]
<<
":"
<<
int32_bias_data
[
1
]
<<
":"
VLOG
(
3
)
<<
int32_bias_data
[
0
]
<<
":"
<<
int32_bias_data
[
1
]
<<
":"
<<
int32_bias_data
[
2
]
<<
":"
<<
int32_bias_data
[
3
];
<<
int32_bias_data
[
2
]
<<
":"
<<
int32_bias_data
[
3
];
neuron_errCode
=
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
model
,
NeuronModel_setOperandValue
(
model
,
bias_node
->
index
(),
bias_node
->
index
(),
bias
->
raw_data
(),
bias
->
raw_data
(),
bias
->
memory_size
());
// 2: bias
bias
->
memory_size
());
// 2: bias
}
else
{
}
else
{
auto
int32_bias
=
std
::
make_shared
<
Tensor
>
();
auto
int32_bias
=
std
::
make_shared
<
Tensor
>
();
int32_bias
->
Resize
({
1
,
out_dims
[
1
]});
int32_bias
->
Resize
({
1
,
out_dims
[
1
]});
...
@@ -211,15 +205,15 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -211,15 +205,15 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
memset
(
int32_bias
->
mutable_data
<
int32_t
>
(),
0
,
int32_bias
->
memory_size
());
memset
(
int32_bias
->
mutable_data
<
int32_t
>
(),
0
,
int32_bias
->
memory_size
());
VLOG
(
3
)
<<
"default: "
<<
int32_bias
->
memory_size
();
VLOG
(
3
)
<<
"default: "
<<
int32_bias
->
memory_size
();
neuron_errCode
=
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
model
,
NeuronModel_setOperandValue
(
model
,
bias_node
->
index
(),
bias_node
->
index
(),
int32_bias
->
raw_data
(),
int32_bias
->
raw_data
(),
int32_bias
->
memory_size
());
// 2: bias
int32_bias
->
memory_size
());
// 2: bias
bias_node
->
set_data
(
int32_bias
);
bias_node
->
set_data
(
int32_bias
);
}
}
// Add fuse value
// Add fuse value
int32_t
fuse_val
[
1
]
=
{
0
};
int32_t
fuse_val
[
1
]
=
{
0
};
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
// 3: fuse
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
// 3: fuse
std
::
vector
<
uint32_t
>
addInIndex
=
{
in_node
->
index
(),
std
::
vector
<
uint32_t
>
addInIndex
=
{
in_node
->
index
(),
...
@@ -227,12 +221,12 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -227,12 +221,12 @@ int FCConverter(void* ctx, OpLite* op, KernelBase* kernel) {
bias_node
->
index
(),
bias_node
->
index
(),
fuse_node
->
index
()};
fuse_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
out_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
out_node
->
index
()};
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_FULLY_CONNECTED
,
NEURON_FULLY_CONNECTED
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Add op fail:"
<<
op_type
;
LOG
(
WARNING
)
<<
"Add op fail:"
<<
op_type
;
...
...
lite/kernels/apu/bridges/graph.h
浏览文件 @
fda90afb
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
#include <unordered_map>
#include <unordered_map>
#include <utility>
#include <utility>
#include <vector>
#include <vector>
#include "
NeuronA
dapter.h"
#include "
lite/backends/apu/neuron_a
dapter.h"
#include "lite/core/op_lite.h"
#include "lite/core/op_lite.h"
#include "lite/core/tensor.h"
#include "lite/core/tensor.h"
...
@@ -64,9 +64,6 @@ class Graph {
...
@@ -64,9 +64,6 @@ class Graph {
void
set_model
(
NeuronModel
*
model
)
{
model_
=
model
;
}
void
set_model
(
NeuronModel
*
model
)
{
model_
=
model
;
}
NeuronModel
*
model
()
{
return
model_
;
}
NeuronModel
*
model
()
{
return
model_
;
}
void
set_libHandle
(
void
*
libHandle
)
{
libHandle_
=
libHandle
;
}
void
*
libHandle
()
{
return
libHandle_
;
}
void
set_input_names
(
const
std
::
vector
<
std
::
string
>
input_names
)
{
void
set_input_names
(
const
std
::
vector
<
std
::
string
>
input_names
)
{
input_names_
=
input_names
;
input_names_
=
input_names
;
}
}
...
@@ -99,7 +96,6 @@ class Graph {
...
@@ -99,7 +96,6 @@ class Graph {
}
}
private:
private:
void
*
libHandle_
;
NeuronModel
*
model_
;
NeuronModel
*
model_
;
std
::
unordered_map
<
std
::
string
,
std
::
vector
<
std
::
shared_ptr
<
Node
>>>
nodes_
;
std
::
unordered_map
<
std
::
string
,
std
::
vector
<
std
::
shared_ptr
<
Node
>>>
nodes_
;
int32_t
operandIdx_
=
0
;
int32_t
operandIdx_
=
0
;
...
...
lite/kernels/apu/bridges/pool_op.cc
浏览文件 @
fda90afb
...
@@ -32,12 +32,6 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -32,12 +32,6 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
auto
scope
=
op
->
scope
();
auto
scope
=
op
->
scope
();
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"] "
;
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"] "
;
auto
libHandle
=
graph
->
libHandle
();
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperand
,
neuron_model_addOperand
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandValue
,
neuron_model_setOperandValue
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperation
,
neuron_model_addOperation
)
// Get input and output vars and op attributes
// Get input and output vars and op attributes
auto
x_name
=
op_info
->
Input
(
"X"
).
front
();
auto
x_name
=
op_info
->
Input
(
"X"
).
front
();
auto
x
=
scope
->
FindMutableTensor
(
x_name
);
auto
x
=
scope
->
FindMutableTensor
(
x_name
);
...
@@ -127,7 +121,7 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -127,7 +121,7 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
x_node
=
graph
->
Get
(
x_name
);
x_node
=
graph
->
Get
(
x_name
);
}
else
{
}
else
{
// add input operand
// add input operand
(
*
neuron_model_addOperand
)
(
model
,
&
xType
);
// 0: x
NeuronModel_addOperand
(
model
,
&
xType
);
// 0: x
x_node
=
graph
->
Add
(
x_name
,
dims_x
);
x_node
=
graph
->
Add
(
x_name
,
dims_x
);
}
}
VLOG
(
3
)
<<
"x_scale: "
<<
x_scale
<<
", xType: "
<<
xType
.
dimensions
[
0
]
<<
":"
VLOG
(
3
)
<<
"x_scale: "
<<
x_scale
<<
", xType: "
<<
xType
.
dimensions
[
0
]
<<
":"
...
@@ -140,39 +134,39 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -140,39 +134,39 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
std
::
vector
<
uint32_t
>
dims_int32
=
{
0
};
std
::
vector
<
uint32_t
>
dims_int32
=
{
0
};
std
::
shared_ptr
<
Node
>
paddingL_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingL_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 1: padding left
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 1: padding left
paddingL_node
=
graph
->
Add
(
x_name
+
"_padding_left"
,
dims_int32
);
paddingL_node
=
graph
->
Add
(
x_name
+
"_padding_left"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingR_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingR_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 2: padding right
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 2: padding right
paddingR_node
=
graph
->
Add
(
x_name
+
"_padding_right"
,
dims_int32
);
paddingR_node
=
graph
->
Add
(
x_name
+
"_padding_right"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingT_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingT_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 3: padding top
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 3: padding top
paddingT_node
=
graph
->
Add
(
x_name
+
"_padding_top"
,
dims_int32
);
paddingT_node
=
graph
->
Add
(
x_name
+
"_padding_top"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
paddingB_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
paddingB_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 4: padding bottom
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 4: padding bottom
paddingB_node
=
graph
->
Add
(
x_name
+
"_padding_bottom"
,
dims_int32
);
paddingB_node
=
graph
->
Add
(
x_name
+
"_padding_bottom"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
strideW_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
strideW_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 5: stride width
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 5: stride width
strideW_node
=
graph
->
Add
(
x_name
+
"_stride_width"
,
dims_int32
);
strideW_node
=
graph
->
Add
(
x_name
+
"_stride_width"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
strideH_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
strideH_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 6: stride height
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 6: stride height
strideH_node
=
graph
->
Add
(
x_name
+
"_stride_height"
,
dims_int32
);
strideH_node
=
graph
->
Add
(
x_name
+
"_stride_height"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
filterW_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
filterW_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 7: filter width
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 7: filter width
filterW_node
=
graph
->
Add
(
x_name
+
"_filter_width"
,
dims_int32
);
filterW_node
=
graph
->
Add
(
x_name
+
"_filter_width"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
filterH_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
filterH_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 8: filter height
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 8: filter height
filterH_node
=
graph
->
Add
(
x_name
+
"_filter_height"
,
dims_int32
);
filterH_node
=
graph
->
Add
(
x_name
+
"_filter_height"
,
dims_int32
);
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
fuse_node
=
nullptr
;
(
*
neuron_model_addOperand
)
(
model
,
&
int32Type
);
// 9: fuse
NeuronModel_addOperand
(
model
,
&
int32Type
);
// 9: fuse
fuse_node
=
graph
->
Add
(
x_name
+
"_fuse"
,
dims_int32
);
fuse_node
=
graph
->
Add
(
x_name
+
"_fuse"
,
dims_int32
);
// Add out type
// Add out type
...
@@ -191,7 +185,7 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -191,7 +185,7 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
if
(
graph
->
Has
(
out_name
))
{
if
(
graph
->
Has
(
out_name
))
{
out_node
=
graph
->
Get
(
out_name
);
out_node
=
graph
->
Get
(
out_name
);
}
else
{
}
else
{
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// out
NeuronModel_addOperand
(
model
,
&
outType
);
// out
out_node
=
graph
->
Add
(
out_name
,
dims_out
);
out_node
=
graph
->
Add
(
out_name
,
dims_out
);
}
}
VLOG
(
3
)
<<
"output_scale: "
<<
x_scale
VLOG
(
3
)
<<
"output_scale: "
<<
x_scale
...
@@ -202,39 +196,39 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -202,39 +196,39 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
// Add padding value
// Add padding value
int32_t
padding_val
[
1
];
int32_t
padding_val
[
1
];
padding_val
[
0
]
=
paddings
[
2
];
padding_val
[
0
]
=
paddings
[
2
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingL_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingL_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
3
];
padding_val
[
0
]
=
paddings
[
3
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingR_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingR_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
0
];
padding_val
[
0
]
=
paddings
[
0
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingT_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingT_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
padding_val
[
0
]
=
paddings
[
1
];
padding_val
[
0
]
=
paddings
[
1
];
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
paddingB_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
model
,
paddingB_node
->
index
(),
padding_val
,
sizeof
(
int32_t
)
*
1
);
// Add Stride
// Add Stride
int32_t
stride_val
[
1
];
int32_t
stride_val
[
1
];
stride_val
[
0
]
=
strides
[
1
];
// width
stride_val
[
0
]
=
strides
[
1
];
// width
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
strideW_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
model
,
strideW_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
stride_val
[
0
]
=
strides
[
0
];
// height
stride_val
[
0
]
=
strides
[
0
];
// height
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
strideH_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
model
,
strideH_node
->
index
(),
stride_val
,
sizeof
(
int32_t
)
*
1
);
// Add filter
// Add filter
int32_t
filter_val
[
1
];
int32_t
filter_val
[
1
];
filter_val
[
0
]
=
global_pooling
?
x_dims
[
3
]
:
ksize
[
1
];
// width
filter_val
[
0
]
=
global_pooling
?
x_dims
[
3
]
:
ksize
[
1
];
// width
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
filterW_node
->
index
(),
filter_val
,
sizeof
(
int32_t
)
*
1
);
model
,
filterW_node
->
index
(),
filter_val
,
sizeof
(
int32_t
)
*
1
);
filter_val
[
0
]
=
global_pooling
?
x_dims
[
2
]
:
ksize
[
0
];
// height
filter_val
[
0
]
=
global_pooling
?
x_dims
[
2
]
:
ksize
[
0
];
// height
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
filterH_node
->
index
(),
filter_val
,
sizeof
(
int32_t
)
*
1
);
model
,
filterH_node
->
index
(),
filter_val
,
sizeof
(
int32_t
)
*
1
);
// Add fuse
// Add fuse
int32_t
fuse_val
[
1
]
=
{
0
};
int32_t
fuse_val
[
1
]
=
{
0
};
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
model
,
fuse_node
->
index
(),
fuse_val
,
sizeof
(
int32_t
)
*
1
);
std
::
vector
<
uint32_t
>
addInIndex
=
{
x_node
->
index
(),
std
::
vector
<
uint32_t
>
addInIndex
=
{
x_node
->
index
(),
...
@@ -251,19 +245,19 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -251,19 +245,19 @@ int PoolConverter(void* ctx, OpLite* op, KernelBase* kernel) {
int
neuron_errCode
;
int
neuron_errCode
;
if
(
pooling_type
==
"max"
)
{
if
(
pooling_type
==
"max"
)
{
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_MAX_POOL_2D
,
NEURON_MAX_POOL_2D
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
}
else
{
}
else
{
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_AVERAGE_POOL_2D
,
NEURON_AVERAGE_POOL_2D
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
}
}
return
REBUILD_WHEN_SHAPE_CHANGED
;
return
REBUILD_WHEN_SHAPE_CHANGED
;
...
...
lite/kernels/apu/bridges/softmax_op.cc
浏览文件 @
fda90afb
...
@@ -31,12 +31,6 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -31,12 +31,6 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
auto
scope
=
op
->
scope
();
auto
scope
=
op
->
scope
();
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"]"
;
VLOG
(
3
)
<<
"[APU] Converting ["
+
op_type
+
"]"
;
auto
libHandle
=
graph
->
libHandle
();
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperand
,
neuron_model_addOperand
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandValue
,
neuron_model_setOperandValue
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperation
,
neuron_model_addOperation
)
// Get input and output vars and op attributes
// Get input and output vars and op attributes
auto
x_name
=
op_info
->
Input
(
"X"
).
front
();
auto
x_name
=
op_info
->
Input
(
"X"
).
front
();
auto
x
=
scope
->
FindMutableTensor
(
x_name
);
auto
x
=
scope
->
FindMutableTensor
(
x_name
);
...
@@ -84,7 +78,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -84,7 +78,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
VLOG
(
3
)
<<
"Graph has "
<<
x_name
<<
",index: "
<<
x_node
->
index
();
VLOG
(
3
)
<<
"Graph has "
<<
x_name
<<
",index: "
<<
x_node
->
index
();
}
else
{
}
else
{
// add input operand
// add input operand
(
*
neuron_model_addOperand
)
(
model
,
&
xType
);
// 0: input
NeuronModel_addOperand
(
model
,
&
xType
);
// 0: input
x_node
=
graph
->
Add
(
x_name
,
dims_x
);
x_node
=
graph
->
Add
(
x_name
,
dims_x
);
}
}
VLOG
(
3
)
<<
"input_scale size: "
<<
input_scale
VLOG
(
3
)
<<
"input_scale size: "
<<
input_scale
...
@@ -95,7 +89,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -95,7 +89,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
NeuronOperandType
betaType
;
NeuronOperandType
betaType
;
betaType
.
type
=
NEURON_FLOAT32
;
betaType
.
type
=
NEURON_FLOAT32
;
betaType
.
dimensionCount
=
0
;
betaType
.
dimensionCount
=
0
;
(
*
neuron_model_addOperand
)
(
model
,
&
betaType
);
// 1: beta
NeuronModel_addOperand
(
model
,
&
betaType
);
// 1: beta
std
::
shared_ptr
<
Node
>
beta_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
beta_node
=
nullptr
;
beta_node
=
graph
->
Add
(
x_name
+
"_beta"
,
dims_int32
);
beta_node
=
graph
->
Add
(
x_name
+
"_beta"
,
dims_int32
);
...
@@ -103,7 +97,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -103,7 +97,7 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
NeuronOperandType
axisType
;
NeuronOperandType
axisType
;
axisType
.
type
=
NEURON_INT32
;
axisType
.
type
=
NEURON_INT32
;
axisType
.
dimensionCount
=
0
;
axisType
.
dimensionCount
=
0
;
(
*
neuron_model_addOperand
)
(
model
,
&
axisType
);
// 2: axis
NeuronModel_addOperand
(
model
,
&
axisType
);
// 2: axis
std
::
shared_ptr
<
Node
>
axis_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
axis_node
=
nullptr
;
axis_node
=
graph
->
Add
(
x_name
+
"_axis"
,
dims_int32
);
axis_node
=
graph
->
Add
(
x_name
+
"_axis"
,
dims_int32
);
...
@@ -114,28 +108,28 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
...
@@ -114,28 +108,28 @@ int SoftmaxConverter(void* ctx, OpLite* op, KernelBase* kernel) {
outType
.
zeroPoint
=
128
;
outType
.
zeroPoint
=
128
;
outType
.
dimensionCount
=
x_dims
.
size
();
outType
.
dimensionCount
=
x_dims
.
size
();
outType
.
dimensions
=
&
dims_x
[
0
];
outType
.
dimensions
=
&
dims_x
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// 3: output
NeuronModel_addOperand
(
model
,
&
outType
);
// 3: output
std
::
shared_ptr
<
Node
>
out_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
out_node
=
nullptr
;
out_node
=
graph
->
Add
(
out_name
,
dims_x
);
out_node
=
graph
->
Add
(
out_name
,
dims_x
);
VLOG
(
3
)
<<
"output_scale: "
<<
out_scale
;
VLOG
(
3
)
<<
"output_scale: "
<<
out_scale
;
float
beta_val
[]
=
{
1.0
f
};
float
beta_val
[]
=
{
1.0
f
};
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
beta_node
->
index
(),
beta_val
,
sizeof
(
float
)
*
1
);
model
,
beta_node
->
index
(),
beta_val
,
sizeof
(
float
)
*
1
);
int32_t
axis_val
[
1
];
int32_t
axis_val
[
1
];
axis_val
[
0
]
=
axis
;
axis_val
[
0
]
=
axis
;
(
*
neuron_model_setOperandValue
)
(
NeuronModel_setOperandValue
(
model
,
axis_node
->
index
(),
axis_val
,
sizeof
(
int32_t
)
*
1
);
model
,
axis_node
->
index
(),
axis_val
,
sizeof
(
int32_t
)
*
1
);
std
::
vector
<
uint32_t
>
addInIndex
=
{
std
::
vector
<
uint32_t
>
addInIndex
=
{
x_node
->
index
(),
beta_node
->
index
(),
axis_node
->
index
()};
x_node
->
index
(),
beta_node
->
index
(),
axis_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
out_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
out_node
->
index
()};
int
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
int
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_SOFTMAX
,
NEURON_SOFTMAX
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Add op fail:"
<<
op_type
;
LOG
(
WARNING
)
<<
"Add op fail:"
<<
op_type
;
return
FAILED
;
return
FAILED
;
...
...
lite/kernels/apu/bridges/utility.cc
浏览文件 @
fda90afb
...
@@ -21,58 +21,6 @@ namespace lite {
...
@@ -21,58 +21,6 @@ namespace lite {
namespace
subgraph
{
namespace
subgraph
{
namespace
apu
{
namespace
apu
{
// typedef to the build functions pointer signatures
typedef
int
(
*
Neuron_getVersion
)(
uint32_t
*
version
);
typedef
int
(
*
NeuronModel_create
)(
NeuronModel
**
model
);
typedef
void
(
*
NeuronModel_free
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_finish
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_addOperand
)(
NeuronModel
*
model
,
const
NeuronOperandType
*
type
);
typedef
int
(
*
NeuronModel_setOperandValue
)(
NeuronModel
*
model
,
int32_t
index
,
const
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronModel_addOperation
)(
NeuronModel
*
model
,
NeuronOperationType
type
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
);
typedef
int
(
*
NeuronModel_identifyInputsAndOutputs
)(
NeuronModel
*
model
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
);
typedef
int
(
*
NeuronModel_setOperandSymmPerChannelQuantParams
)(
NeuronModel
*
model
,
int32_t
index
,
const
NeuronSymmPerChannelQuantParams
*
channelQuant
);
typedef
int
(
*
NeuronExecution_create
)(
NeuronCompilation
*
compilation
,
NeuronExecution
**
execution
);
typedef
void
(
*
NeuronExecution_free
)(
NeuronExecution
*
execution
);
typedef
int
(
*
NeuronExecution_setInput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
const
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_setOutput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_compute
)(
NeuronExecution
*
execution
);
void
*
LoadFunc
(
void
*
libHandle
,
const
char
*
name
)
{
CHECK
(
libHandle
!=
nullptr
);
CHECK
(
name
!=
nullptr
);
void
*
fn
=
dlsym
(
libHandle
,
name
);
if
(
fn
==
nullptr
)
{
LOG
(
WARNING
)
<<
"Unable to open Neuron Runtime function ["
<<
name
<<
"] Because "
<<
dlerror
();
}
return
fn
;
}
bool
HasInputArg
(
const
OpInfo
*
op_info
,
bool
HasInputArg
(
const
OpInfo
*
op_info
,
const
Scope
*
scope
,
const
Scope
*
scope
,
const
std
::
string
&
argname
)
{
const
std
::
string
&
argname
)
{
...
@@ -102,11 +50,6 @@ void insert_transpose_node(void* ctx,
...
@@ -102,11 +50,6 @@ void insert_transpose_node(void* ctx,
int
neuron_errCode
;
int
neuron_errCode
;
auto
graph
=
static_cast
<
Graph
*>
(
ctx
);
auto
graph
=
static_cast
<
Graph
*>
(
ctx
);
auto
model
=
graph
->
model
();
auto
model
=
graph
->
model
();
auto
libHandle
=
graph
->
libHandle
();
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperand
,
neuron_model_addOperand
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_setOperandValue
,
neuron_model_setOperandValue
)
LOAD_FUNCTIONS
(
libHandle
,
NeuronModel_addOperation
,
neuron_model_addOperation
)
// Add input
// Add input
NeuronOperandType
inType
;
NeuronOperandType
inType
;
...
@@ -121,7 +64,7 @@ void insert_transpose_node(void* ctx,
...
@@ -121,7 +64,7 @@ void insert_transpose_node(void* ctx,
VLOG
(
3
)
<<
"Has "
<<
input_name
;
VLOG
(
3
)
<<
"Has "
<<
input_name
;
input_node
=
graph
->
Get
(
input_name
);
input_node
=
graph
->
Get
(
input_name
);
}
else
{
}
else
{
neuron_errCode
=
(
*
neuron_model_addOperand
)
(
model
,
&
inType
);
// input
neuron_errCode
=
NeuronModel_addOperand
(
model
,
&
inType
);
// input
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
return
;
return
;
...
@@ -137,7 +80,7 @@ void insert_transpose_node(void* ctx,
...
@@ -137,7 +80,7 @@ void insert_transpose_node(void* ctx,
uint32_t
dims_perms
[
1
]
=
{
4
};
uint32_t
dims_perms
[
1
]
=
{
4
};
permsType
.
dimensions
=
dims_perms
;
permsType
.
dimensions
=
dims_perms
;
neuron_errCode
=
(
*
neuron_model_addOperand
)
(
model
,
&
permsType
);
// perm
neuron_errCode
=
NeuronModel_addOperand
(
model
,
&
permsType
);
// perm
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
return
;
return
;
...
@@ -148,7 +91,7 @@ void insert_transpose_node(void* ctx,
...
@@ -148,7 +91,7 @@ void insert_transpose_node(void* ctx,
VLOG
(
3
)
<<
"axis :"
<<
axis
[
0
]
<<
":"
<<
axis
[
1
]
<<
":"
<<
axis
[
2
]
<<
":"
VLOG
(
3
)
<<
"axis :"
<<
axis
[
0
]
<<
":"
<<
axis
[
1
]
<<
":"
<<
axis
[
2
]
<<
":"
<<
axis
[
3
];
<<
axis
[
3
];
// &axis[0], sizeof(int32_t) * axis.size());
// &axis[0], sizeof(int32_t) * axis.size());
neuron_errCode
=
(
*
neuron_model_setOperandValue
)
(
neuron_errCode
=
NeuronModel_setOperandValue
(
model
,
perms_node
->
index
(),
&
axis
[
0
],
sizeof
(
int32_t
)
*
axis
.
size
());
model
,
perms_node
->
index
(),
&
axis
[
0
],
sizeof
(
int32_t
)
*
axis
.
size
());
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
...
@@ -163,7 +106,7 @@ void insert_transpose_node(void* ctx,
...
@@ -163,7 +106,7 @@ void insert_transpose_node(void* ctx,
outType
.
dimensionCount
=
output_shape
.
size
();
outType
.
dimensionCount
=
output_shape
.
size
();
outType
.
dimensions
=
&
output_shape
[
0
];
outType
.
dimensions
=
&
output_shape
[
0
];
(
*
neuron_model_addOperand
)
(
model
,
&
outType
);
// output
NeuronModel_addOperand
(
model
,
&
outType
);
// output
std
::
shared_ptr
<
Node
>
output_node
=
nullptr
;
std
::
shared_ptr
<
Node
>
output_node
=
nullptr
;
output_node
=
graph
->
Add
(
output_name
,
output_shape
);
output_node
=
graph
->
Add
(
output_name
,
output_shape
);
...
@@ -172,12 +115,12 @@ void insert_transpose_node(void* ctx,
...
@@ -172,12 +115,12 @@ void insert_transpose_node(void* ctx,
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
std
::
vector
<
uint32_t
>
addOutIndex
=
{
output_node
->
index
()};
neuron_errCode
=
(
*
neuron_model_addOperation
)
(
model
,
neuron_errCode
=
NeuronModel_addOperation
(
model
,
NEURON_TRANSPOSE
,
NEURON_TRANSPOSE
,
addInIndex
.
size
(),
addInIndex
.
size
(),
&
addInIndex
[
0
],
&
addInIndex
[
0
],
addOutIndex
.
size
(),
addOutIndex
.
size
(),
&
addOutIndex
[
0
]);
&
addOutIndex
[
0
]);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
LOG
(
WARNING
)
<<
"Insert transpose op fail!"
;
...
...
lite/kernels/apu/bridges/utility.h
浏览文件 @
fda90afb
...
@@ -20,7 +20,6 @@
...
@@ -20,7 +20,6 @@
#include <string>
#include <string>
#include <unordered_map>
#include <unordered_map>
#include <vector>
#include <vector>
#include "NeuronAdapter.h"
#include "lite/core/op_lite.h"
#include "lite/core/op_lite.h"
#include "lite/utils/macros.h"
#include "lite/utils/macros.h"
...
@@ -29,53 +28,6 @@ namespace lite {
...
@@ -29,53 +28,6 @@ namespace lite {
namespace
subgraph
{
namespace
subgraph
{
namespace
apu
{
namespace
apu
{
// typedef to the build functions pointer signatures
typedef
int
(
*
Neuron_getVersion
)(
uint32_t
*
version
);
typedef
int
(
*
NeuronModel_create
)(
NeuronModel
**
model
);
typedef
void
(
*
NeuronModel_free
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_finish
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_addOperand
)(
NeuronModel
*
model
,
const
NeuronOperandType
*
type
);
typedef
int
(
*
NeuronModel_setOperandValue
)(
NeuronModel
*
model
,
int32_t
index
,
const
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronModel_addOperation
)(
NeuronModel
*
model
,
NeuronOperationType
type
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
);
typedef
int
(
*
NeuronModel_identifyInputsAndOutputs
)(
NeuronModel
*
model
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
);
typedef
int
(
*
NeuronModel_setOperandSymmPerChannelQuantParams
)(
NeuronModel
*
model
,
int32_t
index
,
const
NeuronSymmPerChannelQuantParams
*
channelQuant
);
typedef
int
(
*
NeuronExecution_create
)(
NeuronCompilation
*
compilation
,
NeuronExecution
**
execution
);
typedef
void
(
*
NeuronExecution_free
)(
NeuronExecution
*
execution
);
typedef
int
(
*
NeuronExecution_setInput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
const
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_setOutput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_compute
)(
NeuronExecution
*
execution
);
void
*
LoadFunc
(
void
*
libHandle
,
const
char
*
name
);
#define LOAD_FUNCTIONS(libHandle, FUNC_NAME, VARIABLE_NAME) \
FUNC_NAME VARIABLE_NAME = \
reinterpret_cast<FUNC_NAME>(LoadFunc(libHandle, #FUNC_NAME));
// Type/tensor converters for converting Paddle type/tensor to HiAI type/tensor
// Type/tensor converters for converting Paddle type/tensor to HiAI type/tensor
bool
HasInputArg
(
const
OpInfo
*
op_info
,
bool
HasInputArg
(
const
OpInfo
*
op_info
,
const
Scope
*
scope
,
const
Scope
*
scope
,
...
...
lite/kernels/apu/subgraph_compute.cc
浏览文件 @
fda90afb
...
@@ -28,58 +28,18 @@ namespace lite {
...
@@ -28,58 +28,18 @@ namespace lite {
namespace
kernels
{
namespace
kernels
{
namespace
apu
{
namespace
apu
{
inline
void
*
LoadFunc
(
void
*
libHandle
,
const
char
*
name
)
{
CHECK
(
libHandle
!=
nullptr
);
CHECK
(
name
!=
nullptr
);
void
*
fn
=
dlsym
(
libHandle
,
name
);
if
(
fn
==
nullptr
)
{
LOG
(
WARNING
)
<<
"Unable to open Neuron Runtime function ["
<<
name
<<
"] Because "
<<
dlerror
();
}
return
fn
;
}
#define LOAD_FUNCTIONS(libHandle, FUNC_NAME, VARIABLE_NAME) \
FUNC_NAME VARIABLE_NAME = \
reinterpret_cast<FUNC_NAME>(LoadFunc(libHandle, #FUNC_NAME));
int
SubgraphEngine
::
BuildDeviceProgram
()
{
int
SubgraphEngine
::
BuildDeviceProgram
()
{
typedef
int
(
*
Neuron_getVersion
)(
uint32_t
*
version
);
typedef
int
(
*
NeuronModel_create
)(
NeuronModel
*
*
model
);
typedef
void
(
*
NeuronModel_free
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_finish
)(
NeuronModel
*
model
);
typedef
int
(
*
NeuronModel_identifyInputsAndOutputs
)(
NeuronModel
*
model
,
uint32_t
inputCount
,
const
uint32_t
*
inputs
,
uint32_t
outputCount
,
const
uint32_t
*
outputs
);
// Open the share library
libHandle_
=
dlopen
(
"libneuron_adapter.so"
,
RTLD_LAZY
);
if
(
libHandle_
==
nullptr
)
{
LOG
(
WARNING
)
<<
"Failed to open libneuron_adapter.so. "
<<
dlerror
();
return
subgraph
::
FAILED
;
}
LOAD_FUNCTIONS
(
libHandle_
,
Neuron_getVersion
,
neuron_getVersion
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronModel_create
,
neuron_model_create
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronModel_finish
,
neuron_model_finish
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronModel_identifyInputsAndOutputs
,
neuron_model_identifyInputsAndOutputs
)
unsigned
int
version
;
unsigned
int
version
;
(
*
neuron_getVersion
)
(
&
version
);
Neuron_getVersion
(
&
version
);
VLOG
(
3
)
<<
"Neuron Adapter version: "
<<
version
;
VLOG
(
3
)
<<
"Neuron Adapter version: "
<<
version
;
int
status
=
0
;
int
status
=
0
;
subgraph
::
apu
::
Graph
graph
;
subgraph
::
apu
::
Graph
graph
;
int
neuron_errCode
=
(
*
neuron_model_create
)
(
&
model_
);
int
neuron_errCode
=
NeuronModel_create
(
&
model_
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Fail to create model"
;
LOG
(
WARNING
)
<<
"Fail to create model"
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
}
}
graph
.
set_libHandle
(
libHandle_
);
graph
.
set_model
(
model_
);
graph
.
set_model
(
model_
);
graph
.
set_input_names
(
input_names_
);
graph
.
set_input_names
(
input_names_
);
graph
.
set_output_names
(
output_names_
);
graph
.
set_output_names
(
output_names_
);
...
@@ -151,9 +111,9 @@ int SubgraphEngine::BuildDeviceProgram() {
...
@@ -151,9 +111,9 @@ int SubgraphEngine::BuildDeviceProgram() {
VLOG
(
3
)
<<
"ins size: "
<<
ins
.
size
()
<<
" outs size:"
<<
outs
.
size
();
VLOG
(
3
)
<<
"ins size: "
<<
ins
.
size
()
<<
" outs size:"
<<
outs
.
size
();
// Set subgraph input/output
// Set subgraph input/output
(
*
neuron_model_identifyInputsAndOutputs
)
(
NeuronModel_identifyInputsAndOutputs
(
model_
,
ins
.
size
(),
&
ins
[
0
],
outs
.
size
(),
&
outs
[
0
]);
model_
,
ins
.
size
(),
&
ins
[
0
],
outs
.
size
(),
&
outs
[
0
]);
neuron_errCode
=
(
*
neuron_model_finish
)
(
model_
);
neuron_errCode
=
NeuronModel_finish
(
model_
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Fail to create NIR model:"
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"Fail to create NIR model:"
<<
neuron_errCode
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
...
@@ -166,7 +126,7 @@ int SubgraphEngine::BuildDeviceProgram() {
...
@@ -166,7 +126,7 @@ int SubgraphEngine::BuildDeviceProgram() {
return
1e+6
*
time
.
tv_sec
+
time
.
tv_usec
;
return
1e+6
*
time
.
tv_sec
+
time
.
tv_usec
;
};
};
auto
start_time
=
GetCurrentUS
();
auto
start_time
=
GetCurrentUS
();
compilation_
=
lite
::
apu
::
Device
::
Global
().
Build
(
libHandle_
,
model_
);
compilation_
=
lite
::
apu
::
Device
::
Global
().
Build
(
model_
);
if
(
compilation_
==
nullptr
)
{
if
(
compilation_
==
nullptr
)
{
LOG
(
WARNING
)
<<
"[APU] Build APU DLA model failed!"
;
LOG
(
WARNING
)
<<
"[APU] Build APU DLA model failed!"
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
...
@@ -178,30 +138,6 @@ int SubgraphEngine::BuildDeviceProgram() {
...
@@ -178,30 +138,6 @@ int SubgraphEngine::BuildDeviceProgram() {
}
}
int
SubgraphEngine
::
LaunchDeviceProgram
()
{
int
SubgraphEngine
::
LaunchDeviceProgram
()
{
typedef
int
(
*
NeuronExecution_create
)(
NeuronCompilation
*
compilation
,
NeuronExecution
*
*
execution
);
typedef
void
(
*
NeuronExecution_free
)(
NeuronExecution
*
execution
);
typedef
int
(
*
NeuronExecution_setInput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
const
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_setOutput
)(
NeuronExecution
*
execution
,
int32_t
index
,
const
NeuronOperandType
*
type
,
void
*
buffer
,
size_t
length
);
typedef
int
(
*
NeuronExecution_compute
)(
NeuronExecution
*
execution
);
LOAD_FUNCTIONS
(
libHandle_
,
NeuronExecution_create
,
neuron_execution_create
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronExecution_free
,
neuron_execution_free
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronExecution_setInput
,
neuron_execution_setInput
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronExecution_setOutput
,
neuron_execution_setOutput
)
LOAD_FUNCTIONS
(
libHandle_
,
NeuronExecution_compute
,
neuron_execution_compute
)
NeuronExecution
*
run1
=
NULL
;
auto
GetCurrentUS
=
[]()
->
double
{
auto
GetCurrentUS
=
[]()
->
double
{
struct
timeval
time
;
struct
timeval
time
;
gettimeofday
(
&
time
,
NULL
);
gettimeofday
(
&
time
,
NULL
);
...
@@ -209,7 +145,8 @@ int SubgraphEngine::LaunchDeviceProgram() {
...
@@ -209,7 +145,8 @@ int SubgraphEngine::LaunchDeviceProgram() {
};
};
auto
start_time
=
GetCurrentUS
();
auto
start_time
=
GetCurrentUS
();
int
neuron_errCode
=
(
*
neuron_execution_create
)(
compilation_
,
&
run1
);
NeuronExecution
*
run
=
NULL
;
int
neuron_errCode
=
NeuronExecution_create
(
compilation_
,
&
run
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"[APU] Build APU runtime failed!"
;
LOG
(
WARNING
)
<<
"[APU] Build APU runtime failed!"
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
...
@@ -226,21 +163,21 @@ int SubgraphEngine::LaunchDeviceProgram() {
...
@@ -226,21 +163,21 @@ int SubgraphEngine::LaunchDeviceProgram() {
for
(
int
j
=
0
;
j
<
origin_itensors_
[
i
]
->
data_size
();
j
++
)
{
for
(
int
j
=
0
;
j
<
origin_itensors_
[
i
]
->
data_size
();
j
++
)
{
input_data
[
j
]
+=
(
uint8_t
)
128
;
input_data
[
j
]
+=
(
uint8_t
)
128
;
}
}
(
*
neuron_execution_setInput
)
(
NeuronExecution_setInput
(
run
1
,
i
,
NULL
,
input_data
,
origin_itensors_
[
i
]
->
memory_size
());
run
,
i
,
NULL
,
input_data
,
origin_itensors_
[
i
]
->
memory_size
());
}
}
// Set output buffer
// Set output buffer
for
(
size_t
i
=
0
;
i
<
origin_otensors_
.
size
();
i
++
)
{
for
(
size_t
i
=
0
;
i
<
origin_otensors_
.
size
();
i
++
)
{
(
*
neuron_execution_setOutput
)
(
NeuronExecution_setOutput
(
run
1
,
run
,
i
,
i
,
NULL
,
NULL
,
reinterpret_cast
<
void
*>
(
origin_otensors_
[
i
]
->
raw_data
()),
reinterpret_cast
<
void
*>
(
origin_otensors_
[
i
]
->
raw_data
()),
origin_otensors_
[
i
]
->
memory_size
());
origin_otensors_
[
i
]
->
memory_size
());
}
}
neuron_errCode
=
(
*
neuron_execution_compute
)(
run1
);
neuron_errCode
=
NeuronExecution_compute
(
run
);
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
if
(
NEURON_NO_ERROR
!=
neuron_errCode
)
{
LOG
(
WARNING
)
<<
"Fail to run execution!"
<<
neuron_errCode
;
LOG
(
WARNING
)
<<
"Fail to run execution!"
<<
neuron_errCode
;
return
subgraph
::
FAILED
;
return
subgraph
::
FAILED
;
...
@@ -253,11 +190,20 @@ int SubgraphEngine::LaunchDeviceProgram() {
...
@@ -253,11 +190,20 @@ int SubgraphEngine::LaunchDeviceProgram() {
output_data
[
j
]
-=
(
int8_t
)
128
;
output_data
[
j
]
-=
(
int8_t
)
128
;
}
}
}
}
(
*
neuron_execution_free
)(
run1
);
NeuronExecution_free
(
run
);
VLOG
(
3
)
<<
"[APU] Process cost "
<<
GetCurrentUS
()
-
start_time
<<
" us"
;
VLOG
(
3
)
<<
"[APU] Process cost "
<<
GetCurrentUS
()
-
start_time
<<
" us"
;
return
0
;
return
0
;
}
}
SubgraphEngine
::~
SubgraphEngine
()
{
if
(
compilation_
)
{
NeuronCompilation_free
(
compilation_
);
}
if
(
model_
)
{
NeuronModel_free
(
model_
);
}
}
void
SubgraphCompute
::
PrepareForRun
()
{
void
SubgraphCompute
::
PrepareForRun
()
{
auto
&
param
=
this
->
Param
<
param_t
>
();
auto
&
param
=
this
->
Param
<
param_t
>
();
engine_
.
reset
(
new
SubgraphEngine
(
ctx_
.
get
(),
engine_
.
reset
(
new
SubgraphEngine
(
ctx_
.
get
(),
...
...
lite/kernels/apu/subgraph_compute.h
浏览文件 @
fda90afb
...
@@ -38,12 +38,12 @@ class SubgraphEngine : public subgraph::Engine {
...
@@ -38,12 +38,12 @@ class SubgraphEngine : public subgraph::Engine {
:
subgraph
::
Engine
(
:
subgraph
::
Engine
(
ctx
,
block_idx
,
block_desc
,
input_names
,
output_names
,
scope
)
{}
ctx
,
block_idx
,
block_desc
,
input_names
,
output_names
,
scope
)
{}
~
SubgraphEngine
();
protected:
protected:
int
BuildDeviceProgram
()
override
;
int
BuildDeviceProgram
()
override
;
int
LaunchDeviceProgram
()
override
;
int
LaunchDeviceProgram
()
override
;
std
::
string
model_name_
;
void
*
libHandle_
;
NeuronModel
*
model_
;
NeuronModel
*
model_
;
NeuronCompilation
*
compilation_
;
NeuronCompilation
*
compilation_
;
};
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录