Removed const transformer usage in graph transformer (#1164)

* Commented constant folding

* Fix
This commit is contained in:
Ilya Lavrenov 2020-07-03 13:29:43 +03:00 committed by GitHub
parent ab19051b7d
commit 5d573e39cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 943 deletions

View File

@ -40,11 +40,6 @@ public:
*/
void fullTrim();
/**
* @brief move blobs from Constant layers to Convolution or FullyConnected layers attributes
*/
void moveWeights();
protected:
/**
* @brief collect all const layers with marking if it defines shape (1 - for shape, 0 - otherwise)

View File

@ -12,7 +12,6 @@
#include <map>
#include <utility>
#include <memory>
#include <shape_infer/const_infer/ie_const_infer_holder.hpp>
#include <string>
#include <vector>
#include <mutex>
@ -29,7 +28,7 @@ using namespace InferenceEngine::details;
namespace InferenceEngine {
bool isForFakeQuantzie(const CNNLayer& layer) {
bool isForFakeQuantize(const CNNLayer& layer) {
for (const DataPtr data : layer.outData) {
for (const auto it : data->getInputTo()) {
const CNNLayerPtr childLayer = it.second;
@ -233,7 +232,8 @@ static std::vector<std::string> skipConstInfer = {
"FakeQuantize",
"Quantize",
"CumSum", // Const inference function for CumSum is not implemented
"Convolution" // Const inference function for Convolution is not implemented
"Convolution", // Const inference function for Convolution is not implemented
"Eltwise", // Const inference function for Eltwise is not implemented
};
const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::vector<CNNLayerPtr>& sortedLayers) {
@ -243,7 +243,8 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
// Layers with "Shape" and "Const" type are Const by definition
if (layer->type == "Shape" || layer->type == "Const") {
mapConstLayers[layer->name] = false;
} else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() && !isForFakeQuantzie(*layer)) {
} else if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end() &&
!isForFakeQuantize(*layer)) {
bool isAllInputsConst = true;
for (auto const& data : layer->insData) {
auto creator = data.lock()->getCreatorLayer().lock();
@ -253,7 +254,7 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
}
} else {
// Empty creator means that it's a network representation via inputs/outs data collection
// And it's a firs layer in network.
// And it's a first layer in network.
isAllInputsConst = false;
}
}
@ -309,7 +310,6 @@ const std::map<std::string, bool> ConstTransformer::getConstLayers(const std::ve
const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>& constLayers,
const std::vector<CNNLayerPtr>& sortedLayers) {
ShapeInfer::ConstInferHolder holder;
BlobMap constData;
auto getInputBlobs = [&constData](const std::vector<DataWeakPtr>& insData,
bool isForShape) -> std::vector<Blob::CPtr> {
@ -344,30 +344,21 @@ const BlobMap ConstTransformer::getConstData(const std::map<std::string, bool>&
};
for (const auto& layer : sortedLayers) {
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) != skipConstInfer.end()) {
continue;
}
if (constLayers.find(layer->name) != constLayers.end()) {
std::string layerName = layer->name;
bool isForShape = constLayers.at(layerName);
auto implPtr = holder.getConstInferImpl(layer->type);
if (!implPtr && !isForShape)
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
"` Layer with `" + layer->type + "` Type on constant propagation";
if (!isForShape && layer->type != "Const")
THROW_IE_EXCEPTION << "Failed to find reference implementation for `" + layer->name +
"` Layer with `" + layer->type + "` Type on constant propagation";
if (!isForShape) {
auto outputBlobs = getOutputBlobs(layer->outData);
auto inp = getInputBlobs(layer->insData, isForShape);
if (std::find(skipConstInfer.begin(), skipConstInfer.end(), layer->type) == skipConstInfer.end())
implPtr->infer(inp, layer->params, layer->blobs, outputBlobs);
for (int i = 0; i < layer->outData.size(); i++) {
std::string dataName = layer->outData[i]->getName();
auto shapes = layer->outData[i]->getTensorDesc().getDims();
outputBlobs[i]->getTensorDesc().reshape(shapes, TensorDesc::getLayoutByDims(shapes));
constData[dataName] = outputBlobs[i];
}
auto & blobs = layer->blobs;
auto it = blobs.find("custom");
if (it == blobs.end())
THROW_IE_EXCEPTION << "Missed `custom` blob in Const layer";
auto dataName = layer->outData[0]->getName();
constData[dataName] = (*it).second;
}
}
}

View File

@ -587,35 +587,6 @@ TEST_F(RemoveLayerTests, canGetConstDataForUnknownImpl) {
ASSERT_EQ(getData("data9")->getTensorDesc().getDims(), refShape);
}
TEST_F(RemoveLayerTests, canFoldConstSubgraphs) {
IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
std::vector<std::string> refNewLayers = {"layer5__data9__Const"};
{ // TODO: method for marking layers
getLayer("layer1")->type = "Mul";
getLayer("layer2")->type = "Shape";
getLayer("layer3")->type = "Power";
getLayer("layer3")->params = {{"power", "1"},
{"scale", "2"},
{"shift", "-4"}};
getLayer("layer4")->type = "Mul";
getLayer("layer5")->type = "Mul";
}
float arr[] = {-2.f, 0.f, 54.f};
auto ref5 = make_blob_with_precision(getData("data9")->getTensorDesc(), arr);
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
IE::CNNNetwork cnnNetwork(net);
ASSERT_EQ(net->allLayers().size(), originalLayersNum - 7);
auto newLayer = CommonTestUtils::getLayerByName(cnnNetwork, refNewLayers[0].c_str());
auto actualBlob = newLayer->blobs["custom"];
ASSERT_NE(actualBlob, nullptr);
ASSERT_FALSE(actualBlob->buffer() == nullptr);
TestsCommon::compare(*actualBlob, *ref5);
ASSERT_EQ(newLayer->type, "Const");
}
TEST_F(RemoveLayerTests, canSkipConstCalculation) {
IE::BlobMap refBlobs = initConstLayers({"input1", "input2", "input3"});
getLayer("layer6")->type = "Reshape";
@ -950,887 +921,3 @@ TEST_F(AdvancedShapeInferTests, canReshapeWithScalar) {
ASSERT_EQ(getData("data1")->getTensorDesc().getDims(), newInShape);
ASSERT_EQ(getData("data3")->getTensorDesc().getDims(), newOutShape);
}
TEST_F(AdvancedShapeInferTests, canFoldConstWithOneHot) {
// Const-d1-OneHot-d2
// \
// I1-d3-Eltw(Sum)-d4
auto testFunc = [&](IE::Precision precision) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precision, IE::SizeVector{2}, IE::Layout::C))
.data("data2", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
.data("data3", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
.data("data4", IE::TensorDesc(precision, IE::SizeVector{10, 2}, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"const", "dummy", precision})
.layer<IE::CNNLayer>(IE::LayerParams{"oneHot", "OneHot", precision})
.layer<IE::CNNLayer>(IE::LayerParams{"input", "input", precision})
.layer<IE::CNNLayer>(IE::LayerParams{"eltwise", "Eltwise", precision})
.linkToData("const", "data1")
.linkDataTo("data1", "oneHot")
.linkToData("oneHot", "data2")
.linkDataTo("data2", "eltwise")
.linkToData("input", "data3")
.linkDataTo("data3", "eltwise")
.linkToData("eltwise", "data4")
.addInput("data3")
.finalize();
getLayer("oneHot")->params = {
{"axis", "-1"},
{"depth", "10"},
{"off_value", "1.0"},
{"on_value", "1.0"}
};
getLayer("eltwise")->params = {
{"operation", "sum"}
};
originalLayersNum = net->allLayers().size();
IE::CNNNetwork cnnNetwork(net);
initConstLayers({"const"});
IE::ConstTransformer transformator(net.get());
transformator.fullTrim();
ASSERT_EQ(net->allLayers().size(), originalLayersNum - 1);
};
testFunc(IE::Precision::FP32);
testFunc(IE::Precision::FP16);
testFunc(IE::Precision::Q78);
testFunc(IE::Precision::I16);
testFunc(IE::Precision::U8);
testFunc(IE::Precision::I8);
testFunc(IE::Precision::U16);
testFunc(IE::Precision::I32);
testFunc(IE::Precision::I64);
testFunc(IE::Precision::U64);
}
TEST_F(AdvancedShapeInferTests, MulWithTensorConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "mulLayer")
.linkDataTo("data2", "mulLayer")
.linkToData("mulLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("mulLayer")->params = {
{"operation", "mul"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 9, 16, 25};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}
TEST_F(AdvancedShapeInferTests, MulWithScalarConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "mulLayer")
.linkDataTo("data2", "mulLayer")
.linkToData("mulLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("mulLayer")->params = {
{"operation", "mul"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 6, 8, 10};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}
TEST_F(AdvancedShapeInferTests, AddWithScalarConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::Layout::SCALAR))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2},IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "addLayer")
.linkDataTo("data2", "addLayer")
.linkToData("addLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("addLayer")->params = {
{"operation", "sum"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 5, 6, 7};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}
TEST_F(AdvancedShapeInferTests, AddWithTensorConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "addLayer")
.linkDataTo("data2", "addLayer")
.linkToData("addLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("addLayer")->params = {
{"operation", "sum"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 6, 8, 10};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}
TEST_F(AdvancedShapeInferTests, AddWithBroadcastingConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{2, 2}, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{2, 1}, IE::Layout::NC))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{2, 2}, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"addLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "addLayer")
.linkDataTo("data2", "addLayer")
.linkToData("addLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("addLayer")->params = {
{"operation", "sum"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 5, 7, 8};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("addLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}
TEST_F(AdvancedShapeInferTests, MulWithBroadcastingConstInferTest) {
auto testFunc = [&](IE::Precision precisionInData1, IE::Precision precisionInData2, IE::Precision precisionOutData) {
netBuilder = NetBuilder();
net = netBuilder
.data("data1", IE::TensorDesc(precisionInData1, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
.data("data2", IE::TensorDesc(precisionInData2, IE::SizeVector{ 2, 1 }, IE::Layout::NC))
.data("data3", IE::TensorDesc(precisionOutData, IE::SizeVector{ 2, 2 }, IE::Layout::NC))
.layer<IE::CNNLayer>(IE::LayerParams{"mulLayer", "Eltwise", IE::Precision::UNSPECIFIED})
.layer<IE::CNNLayer>(IE::LayerParams{"input1", "Const", precisionInData1})
.layer<IE::CNNLayer>(IE::LayerParams{"input2", "Const", precisionInData2})
.linkToData("input1", "data1")
.linkToData("input2", "data2")
.linkDataTo("data1", "mulLayer")
.linkDataTo("data2", "mulLayer")
.linkToData("mulLayer", "data3")
.addInput("data1")
.addInput("data2")
.finalize();
getLayer("mulLayer")->params = {
{"operation", "mul"}
};
IE::CNNNetwork cnnNetwork(net);
initConstLayersDiffPrec({"input1", "input2"});
float ref[] = {4, 6, 12, 15};
if (precisionOutData == IE::Precision::FP16) {
for (int i = 0; i < 4; i++)
ref[i] = IE::PrecisionUtils::f32tof16(ref[i]);
}
IE::ConstTransformer transformator(net.get());
transformator.foldConstSubgraphs();
switch(precisionOutData) {
case IE::Precision::U8: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<uint8_t *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::I64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::U64: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<unsigned long long int *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP16: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<IE::ie_fp16 *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
case IE::Precision::FP32: {
InferenceEngine::CNNLayerPtr layer;
ASSERT_EQ(InferenceEngine::OK, net->getLayerByName("mulLayer__data3__Const", layer, nullptr));
auto *l = layer->blobs.at("custom")->cbuffer().as<float *>();
ASSERT_EQ(l[0], ref[0]);
ASSERT_EQ(l[1], ref[1]);
ASSERT_EQ(l[2], ref[2]);
ASSERT_EQ(l[3], ref[3]);
break;
}
default:
THROW_IE_EXCEPTION << "Unsupported precision!";
}
};
testFunc(IE::Precision::U8, IE::Precision::U8, IE::Precision::U8);
testFunc(IE::Precision::U8, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::U8, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::U8, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U8, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::U8, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::U8, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I32, IE::Precision::I32);
testFunc(IE::Precision::I32, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I32, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::I32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::U8, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I32, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::I64, IE::Precision::I64);
testFunc(IE::Precision::I64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::I64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::U8, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::I32, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::U64, IE::Precision::U64);
testFunc(IE::Precision::U64, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::U64, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U8, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP16, IE::Precision::FP16);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U8, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I32, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::I64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::U64, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP32);
testFunc(IE::Precision::FP32, IE::Precision::FP32, IE::Precision::FP32);
testFunc(IE::Precision::FP16, IE::Precision::FP32, IE::Precision::FP16);
testFunc(IE::Precision::FP32, IE::Precision::FP16, IE::Precision::FP16);
}