Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
冰之2023
Mace
提交
f2b3ea2f
Mace
项目概览
冰之2023
/
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看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f2b3ea2f
编写于
11月 29, 2017
作者:
L
liuqi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support multiple type operation registry.
上级
fd284f6a
变更
20
隐藏空白更改
内联
并排
Showing
20 changed file
with
199 addition
and
38 deletion
+199
-38
mace/core/operator.cc
mace/core/operator.cc
+26
-1
mace/core/operator.h
mace/core/operator.h
+23
-0
mace/core/registry.h
mace/core/registry.h
+2
-2
mace/core/types.cc
mace/core/types.cc
+17
-0
mace/core/types.h
mace/core/types.h
+2
-0
mace/ops/addn.cc
mace/ops/addn.cc
+12
-3
mace/ops/batch_norm.cc
mace/ops/batch_norm.cc
+12
-3
mace/ops/batch_norm_test.cc
mace/ops/batch_norm_test.cc
+8
-6
mace/ops/batch_to_space.cc
mace/ops/batch_to_space.cc
+4
-1
mace/ops/buffer_to_image.cc
mace/ops/buffer_to_image.cc
+9
-1
mace/ops/channel_shuffle.cc
mace/ops/channel_shuffle.cc
+4
-1
mace/ops/concat.cc
mace/ops/concat.cc
+4
-1
mace/ops/conv_2d.cc
mace/ops/conv_2d.cc
+12
-3
mace/ops/depthwise_conv2d.cc
mace/ops/depthwise_conv2d.cc
+9
-3
mace/ops/global_avg_pooling.cc
mace/ops/global_avg_pooling.cc
+6
-2
mace/ops/image_to_buffer.cc
mace/ops/image_to_buffer.cc
+9
-1
mace/ops/pooling.cc
mace/ops/pooling.cc
+13
-3
mace/ops/relu.cc
mace/ops/relu.cc
+13
-3
mace/ops/resize_bilinear.cc
mace/ops/resize_bilinear.cc
+10
-3
mace/ops/space_to_batch.cc
mace/ops/space_to_batch.cc
+4
-1
未找到文件。
mace/core/operator.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,24 @@
namespace
mace
{
OpKeyBuilder
::
OpKeyBuilder
(
const
char
*
op_name
)
:
op_name_
(
op_name
)
{}
OpKeyBuilder
&
OpKeyBuilder
::
TypeConstraint
(
const
char
*
attr_name
,
const
DataType
allowed
)
{
type_constraint_
[
attr_name
]
=
allowed
;
return
*
this
;
}
const
std
::
string
OpKeyBuilder
::
Build
()
{
static
const
std
::
vector
<
std
::
string
>
type_order
=
{
"T"
};
std
::
string
key
=
op_name_
;
for
(
auto
type
:
type_order
)
{
key
+=
type
+
"_"
+
DataTypeToString
(
type_constraint_
[
type
]);
}
return
key
;
}
std
::
map
<
int32_t
,
OperatorRegistry
*>
*
gDeviceTypeRegistry
()
{
static
std
::
map
<
int32_t
,
OperatorRegistry
*>
g_device_type_registry
;
return
&
g_device_type_registry
;
...
...
@@ -33,7 +51,14 @@ unique_ptr<OperatorBase> CreateOperator(const OperatorDef &operator_def,
Workspace
*
ws
,
DeviceType
type
)
{
OperatorRegistry
*
registry
=
gDeviceTypeRegistry
()
->
at
(
type
);
return
registry
->
Create
(
operator_def
.
type
(),
operator_def
,
ws
);
const
int
dtype
=
ArgumentHelper
::
GetSingleArgument
<
OperatorDef
,
int
>
(
operator_def
,
"T"
,
static_cast
<
int
>
(
DT_FLOAT
));
return
registry
->
Create
(
OpKeyBuilder
(
operator_def
.
type
().
data
())
.
TypeConstraint
(
"T"
,
static_cast
<
DataType
>
(
dtype
))
.
Build
(),
operator_def
,
ws
);
}
OperatorBase
::
OperatorBase
(
const
OperatorDef
&
operator_def
,
Workspace
*
ws
)
...
...
mace/core/operator.h
浏览文件 @
f2b3ea2f
...
...
@@ -134,6 +134,29 @@ struct DeviceTypeRegisterer {
}
};
class
OpKeyBuilder
{
public:
explicit
OpKeyBuilder
(
const
char
*
op_name
);
OpKeyBuilder
&
TypeConstraint
(
const
char
*
attr_name
,
const
DataType
allowed
);
template
<
typename
T
>
OpKeyBuilder
&
TypeConstraint
(
const
char
*
attr_name
);
const
std
::
string
Build
();
private:
std
::
string
op_name_
;
std
::
map
<
std
::
string
,
DataType
>
type_constraint_
;
};
template
<
typename
T
>
OpKeyBuilder
&
OpKeyBuilder
::
TypeConstraint
(
const
char
*
attr_name
)
{
return
this
->
TypeConstraint
(
attr_name
,
DataTypeToEnum
<
T
>::
value
);
}
#define MACE_REGISTER_DEVICE_TYPE(type, registry_function) \
namespace { \
static DeviceTypeRegisterer MACE_ANONYMOUS_VARIABLE(DeviceType)( \
...
...
mace/core/registry.h
浏览文件 @
f2b3ea2f
...
...
@@ -106,10 +106,10 @@ class Registerer {
}
#define MACE_REGISTER_CREATOR(RegistryName, key, ...) \
MACE_REGISTER_TYPED_CREATOR(RegistryName,
#
key, __VA_ARGS__)
MACE_REGISTER_TYPED_CREATOR(RegistryName, key, __VA_ARGS__)
#define MACE_REGISTER_CLASS(RegistryName, key, ...) \
MACE_REGISTER_TYPED_CLASS(RegistryName,
#
key, __VA_ARGS__)
MACE_REGISTER_TYPED_CLASS(RegistryName, key, __VA_ARGS__)
}
// namespace mace
...
...
mace/core/types.cc
浏览文件 @
f2b3ea2f
...
...
@@ -24,6 +24,23 @@ bool DataTypeCanUseMemcpy(DataType dt) {
}
}
std
::
string
DataTypeToString
(
const
DataType
dt
)
{
static
std
::
map
<
DataType
,
std
::
string
>
dtype_string_map
=
{
{
DT_FLOAT
,
"DT_FLOAT"
},
{
DT_HALF
,
"DT_HALF"
},
{
DT_DOUBLE
,
"DT_DOUBLE"
},
{
DT_UINT8
,
"DT_UINT8"
},
{
DT_INT8
,
"DT_INT8"
},
{
DT_INT32
,
"DT_INT32"
},
{
DT_UINT32
,
"DT_UINT32"
},
{
DT_UINT16
,
"DT_UINT16"
},
{
DT_INT64
,
"DT_INT64"
},
{
DT_BOOL
,
"DT_BOOL"
},
{
DT_STRING
,
"DT_STRING"
}
};
MACE_CHECK
(
dt
!=
DT_INVALID
)
<<
"Not support Invalid data type"
;
return
dtype_string_map
[
dt
];
}
size_t
GetEnumTypeSize
(
const
DataType
dt
)
{
switch
(
dt
)
{
...
...
mace/core/types.h
浏览文件 @
f2b3ea2f
...
...
@@ -18,6 +18,8 @@ bool DataTypeCanUseMemcpy(DataType dt);
size_t
GetEnumTypeSize
(
const
DataType
dt
);
std
::
string
DataTypeToString
(
const
DataType
dt
);
template
<
class
T
>
struct
IsValidDataType
;
...
...
mace/ops/addn.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,12 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
AddN
,
AddNOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"AddN"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
AddNOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
AddN
,
AddNOp
<
DeviceType
::
NEON
,
float
>
);
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"AddN"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
AddNOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
AddN
,
AddNOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"AddN"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
AddNOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/batch_norm.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,12 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
BatchNorm
,
BatchNormOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"BatchNorm"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
BatchNormOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
BatchNorm
,
BatchNormOp
<
DeviceType
::
NEON
,
float
>
);
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"BatchNorm"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
BatchNormOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
BatchNorm
,
BatchNormOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"BatchNorm"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
BatchNormOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
\ No newline at end of file
mace/ops/batch_norm_test.cc
浏览文件 @
f2b3ea2f
...
...
@@ -165,10 +165,11 @@ TEST_F(BatchNormOpTest, SimpleRandomOPENCL) {
net
.
AddRandomInput
<
DeviceType
::
OPENCL
,
float
>
(
"Var"
,
{
channels
},
true
);
net
.
AddInputFromArray
<
DeviceType
::
OPENCL
,
float
>
(
"Epsilon"
,
{},
{
1e-3
});
// TODO : there is a bug for tuning
// tuning
setenv
(
"MACE_TUNING"
,
"1"
,
1
);
net
.
RunOp
(
DeviceType
::
OPENCL
);
unsetenv
(
"MACE_TUNING"
);
//
setenv("MACE_TUNING", "1", 1);
//
net.RunOp(DeviceType::OPENCL);
//
unsetenv("MACE_TUNING");
// Run on opencl
net
.
RunOp
(
DeviceType
::
OPENCL
);
...
...
@@ -211,10 +212,11 @@ TEST_F(BatchNormOpTest, ComplexRandomOPENCL) {
net
.
AddRandomInput
<
DeviceType
::
OPENCL
,
float
>
(
"Var"
,
{
channels
},
true
);
net
.
AddInputFromArray
<
DeviceType
::
OPENCL
,
float
>
(
"Epsilon"
,
{},
{
1e-3
});
// TODO : there is a bug for tuning
// tuning
setenv
(
"MACE_TUNING"
,
"1"
,
1
);
net
.
RunOp
(
DeviceType
::
OPENCL
);
unsetenv
(
"MACE_TUNING"
);
//
setenv("MACE_TUNING", "1", 1);
//
net.RunOp(DeviceType::OPENCL);
//
unsetenv("MACE_TUNING");
// Run on opencl
net
.
RunOp
(
DeviceType
::
OPENCL
);
...
...
mace/ops/batch_to_space.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,9 @@
namespace
mace
{
REGISTER_OPENCL_OPERATOR
(
BatchToSpaceND
,
BatchToSpaceNDOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"BatchToSpaceND"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
BatchToSpaceNDOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/buffer_to_image.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,14 @@
namespace
mace
{
REGISTER_OPENCL_OPERATOR
(
BufferToImage
,
BufferToImageOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"BufferToImage"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
BufferToImageOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"BufferToImage"
)
.
TypeConstraint
<
half
>
(
"T"
)
.
Build
(),
BufferToImageOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/channel_shuffle.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,9 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
ChannelShuffle
,
ChannelShuffleOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"ChannelShuffle"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ChannelShuffleOp
<
DeviceType
::
CPU
,
float
>
);
}
// namespace mace
mace/ops/concat.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,9 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
Concat
,
ConcatOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"Concat"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ConcatOp
<
DeviceType
::
CPU
,
float
>
);
}
// namespace mace
mace/ops/conv_2d.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,12 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
Conv2D
,
Conv2dOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"Conv2D"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
Conv2dOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
Conv2D
,
Conv2dOp
<
DeviceType
::
NEON
,
float
>
);
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"Conv2D"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
Conv2dOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
Conv2D
,
Conv2dOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"Conv2D"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
Conv2dOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/depthwise_conv2d.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,15 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
DepthwiseConv2d
,
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"DepthwiseConv2d"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
DepthwiseConv2dOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
DepthwiseConv2d
,
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"DepthwiseConv2d"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
DepthwiseConv2dOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
DepthwiseConv2d
,
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"DepthwiseConv2d"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
DepthwiseConv2dOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/global_avg_pooling.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,11 +6,15 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
GlobalAvgPooling
,
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"GlobalAvgPooling"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
GlobalAvgPoolingOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
GlobalAvgPooling
,
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"GlobalAvgPooling"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
GlobalAvgPoolingOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
...
...
mace/ops/image_to_buffer.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,14 @@
namespace
mace
{
REGISTER_OPENCL_OPERATOR
(
ImageToBuffer
,
ImageToBufferOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"ImageToBuffer"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ImageToBufferOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"ImageToBuffer"
)
.
TypeConstraint
<
half
>
(
"T"
)
.
Build
(),
ImageToBufferOp
<
DeviceType
::
OPENCL
,
half
>
);
}
// namespace mace
mace/ops/pooling.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,11 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
Pooling
,
PoolingOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"Pooling"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
PoolingOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
Pooling
,
PoolingOp
<
DeviceType
::
NEON
,
float
>
);
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"Pooling"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
PoolingOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
Pooling
,
PoolingOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"Pooling"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
PoolingOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/relu.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,11 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
Relu
,
ReluOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"Relu"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ReluOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
Relu
,
ReluOp
<
DeviceType
::
NEON
,
float
>
);
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"Relu"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ReluOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
Relu
,
ReluOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"Relu"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ReluOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/resize_bilinear.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,14 +6,21 @@
namespace
mace
{
REGISTER_CPU_OPERATOR
(
ResizeBilinear
,
ResizeBilinearOp
<
DeviceType
::
CPU
,
float
>
);
REGISTER_CPU_OPERATOR
(
OpKeyBuilder
(
"ResizeBilinear"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ResizeBilinearOp
<
DeviceType
::
CPU
,
float
>
);
#if __ARM_NEON
REGISTER_NEON_OPERATOR
(
ResizeBilinear
,
REGISTER_NEON_OPERATOR
(
OpKeyBuilder
(
"ResizeBilinear"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ResizeBilinearOp
<
DeviceType
::
NEON
,
float
>
);
#endif // __ARM_NEON
REGISTER_OPENCL_OPERATOR
(
ResizeBilinear
,
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"ResizeBilinear"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
ResizeBilinearOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
mace/ops/space_to_batch.cc
浏览文件 @
f2b3ea2f
...
...
@@ -6,6 +6,9 @@
namespace
mace
{
REGISTER_OPENCL_OPERATOR
(
SpaceToBatchND
,
SpaceToBatchNDOp
<
DeviceType
::
OPENCL
,
float
>
);
REGISTER_OPENCL_OPERATOR
(
OpKeyBuilder
(
"SpaceToBatchND"
)
.
TypeConstraint
<
float
>
(
"T"
)
.
Build
(),
SpaceToBatchNDOp
<
DeviceType
::
OPENCL
,
float
>
);
}
// namespace mace
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录