return dyn_cast<Caffe2Annotation>(annotation)->getMutableOperatorDef();
}
+bool isOpType(const repr::NNGraph::NodeRef& nodeRef, string typeName) {
+ if (!repr::nn::is<repr::NeuralNetOperator>(nodeRef)) {
+ return false;
+ }
+ auto op = repr::nn::get<repr::NeuralNetOperator>(nodeRef);
+ auto opDef = getOpDef(*op);
+ return opDef.type() == typeName;
+}
+
bool isOnIdeepDevice(const repr::NeuralNetOperator& nnOp) {
// We only want to fuse for IDEEP convs
const auto& op = getOpDef(nnOp);
continue;
}
- if (!repr::nn::is<repr::Sum>(sumNode)) {
+ // CAUTION: On IDEEP device, only element-wise Add operator is
+ // supported yet. It totally works as element-wise sum without scalar broadcast.
+ if (!repr::nn::is<repr::Sum>(sumNode) && !isOpType(sumNode, "Add")) {
continue;
}
- auto sum = repr::nn::get<repr::Sum>(sumNode);
+ auto sum = repr::nn::get<repr::NeuralNetOperator>(sumNode);
if (!isOnIdeepDevice(*sum)) {
LOG(WARNING) << "Not a IDEEP operator";
continue;
batch_size=st.integers(1, 3),
use_bias=st.booleans(),
group=st.integers(1, 1),
+ sum_add=st.sampled_from(["Sum", "Add"]),
**mu.gcs)
def test_convolution_sum_fusion(self, stride, pad, kernel, size,
input_channels, output_channels,
- batch_size, use_bias, group, gc, dc):
+ batch_size, use_bias, group, sum_add, gc, dc):
conv_S0 = core.CreateOperator(
"Conv",
["SX0", "Sw0", "Sb0"] if use_bias else ["SX0", "Sw0"],
device_option=dc[0]
)
sum = core.CreateOperator(
- "Sum",
+ sum_add,
["S0", "Y0"],
["S0"],
device_option=dc[0]
batch_size=st.integers(1, 3),
use_bias=st.booleans(),
group=st.integers(1, 1),
+ sum_add=st.sampled_from(["Sum", "Add"]),
**mu.gcs)
def test_convolution_sum_relu_fusion(self, stride, pad, kernel, size,
input_channels, output_channels,
- batch_size, use_bias, group, gc, dc):
+ batch_size, use_bias, group, sum_add, gc, dc):
conv_S0 = core.CreateOperator(
"Conv",
["SX0", "Sw0", "Sb0"] if use_bias else ["SX0", "Sw0"],
device_option=dc[0]
)
sum = core.CreateOperator(
- "Sum",
+ sum_add,
["S0", "Y0"],
["S0"],
device_option=dc[0]