[CPU] Added dynamism support for StridedSlice (#8532)

This commit is contained in:
Alexandra Sidorova 2021-11-17 22:52:23 +03:00 committed by GitHub
parent ff1f73910f
commit 83b8099363
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 696 additions and 587 deletions

View File

@ -27,7 +27,7 @@ using namespace MKLDNNPlugin;
using namespace InferenceEngine;
using namespace InferenceEngine::details;
static inline size_t parallel_init(size_t start, size_t nDims, const SizeVector& dims, SizeVector& indexes) {
static inline size_t parallel_init(size_t start, size_t nDims, const VectorDims& dims, VectorDims& indexes) {
for (int j = nDims - 1; j >= 0; j--) {
indexes[j] = start % dims[j];
start = start / dims[j];
@ -37,14 +37,17 @@ static inline size_t parallel_init(size_t start, size_t nDims, const SizeVector&
bool MKLDNNStridedSliceNode::isSupportedOperation(const std::shared_ptr<const ngraph::Node>& op, std::string& errorMessage) noexcept {
try {
if (isDynamicNgraphNode(op)) {
errorMessage = "Doesn't support op with dynamic shapes";
auto ss = ov::as_type_ptr<const ngraph::opset1::StridedSlice>(op);
if (!ss) {
errorMessage = "Only opset1 StridedSlice operation is supported";
return false;
}
const auto ss = std::dynamic_pointer_cast<const ngraph::opset1::StridedSlice>(op);
if (!ss) {
errorMessage = "Only opset1 StridedSlice operation is supported";
if (ss->get_input_node_shared_ptr(BEGIN_ID)->get_type_info() != ov::op::v0::Constant::get_type_info_static() ||
ss->get_input_node_shared_ptr(END_ID)->get_type_info() != ov::op::v0::Constant::get_type_info_static() ||
(ss->get_input_size() == 4 && ss->get_input_node_shared_ptr(STRIDE_ID)->get_type_info() != ov::op::v0::Constant::get_type_info_static())) {
// TODO: Support begin, end, stride inputs for dynamic shapes.
errorMessage = "Only Constant 'begin', 'end' and 'stride' inputs are supported.";
return false;
}
} catch (...) {
@ -56,162 +59,150 @@ bool MKLDNNStridedSliceNode::isSupportedOperation(const std::shared_ptr<const ng
MKLDNNStridedSliceNode::MKLDNNStridedSliceNode(const std::shared_ptr<ngraph::Node>& op, const mkldnn::engine& eng, MKLDNNWeightsSharing::Ptr &cache) :
MKLDNNNode(op, eng, cache) {
std::string errorMessage;
if (isSupportedOperation(op, errorMessage)) {
const auto ss = std::dynamic_pointer_cast<const ngraph::opset1::StridedSlice>(op);
const size_t nDims = std::max(inputShapes[DATA_ID].getRank(), outputShapes[0].getRank());
auto createMask = [&](const std::vector<int64_t> &origMask, const int bit = 0, bool needReverse = false) {
std::vector<int> mask(origMask.begin(), origMask.end());
if (needReverse) {
for (size_t i = 0; i < mask.size(); i++)
mask[i] = 1 - mask[i];
}
for (size_t i = mask.size(); i < nDims; ++i) mask.push_back(bit);
return mask;
};
beginMask = createMask(ss->get_begin_mask(), 1, true);
endMask = createMask(ss->get_end_mask(), 1, true);
newAxisMask = createMask(ss->get_new_axis_mask());
shrinkAxisMask = createMask(ss->get_shrink_axis_mask());
auto origEllipsisMask = ss->get_ellipsis_mask();
for (const auto &o : origEllipsisMask) {
ellipsisMask.push_back(o);
}
if (ellipsisMask.size() == 0) {
for (size_t i = ellipsisMask.size(); i < nDims; ++i) ellipsisMask.push_back(0);
}
} else {
if (!isSupportedOperation(op, errorMessage)) {
IE_THROW(NotImplemented) << errorMessage;
}
auto ss = ov::as_type_ptr<const ngraph::opset1::StridedSlice>(op);
if (inputShapes.size() != 3 && inputShapes.size() != 4) {
THROW_ERROR << "has incorrect number of input edges";
}
if (outputShapes.size() != 1) {
THROW_ERROR << "has incorrect number of output edges";
}
const size_t inputRank = getInputShapeAtPort(DATA_ID).getRank();
const size_t outputRank = getOutputShapeAtPort(0).getRank();
const size_t nDims = std::max(inputRank, outputRank);
auto createMask = [&](const std::vector<int64_t> &origMask, const int bit = 0, bool needReverse = false) {
std::vector<int> mask(origMask.begin(), origMask.end());
if (needReverse) {
for (size_t i = 0; i < mask.size(); i++)
mask[i] = 1 - mask[i];
}
for (size_t i = mask.size(); i < nDims; ++i) mask.push_back(bit);
return mask;
};
attrs.beginMask = createMask(ss->get_begin_mask(), 1, true);
attrs.endMask = createMask(ss->get_end_mask(), 1, true);
attrs.newAxisMask = createMask(ss->get_new_axis_mask());
attrs.shrinkAxisMask = createMask(ss->get_shrink_axis_mask());
auto origEllipsisMask = ss->get_ellipsis_mask();
for (const auto &o : origEllipsisMask) {
attrs.ellipsisMask.push_back(o);
}
if (attrs.ellipsisMask.size() == 0) {
for (size_t i = attrs.ellipsisMask.size(); i < nDims; ++i) attrs.ellipsisMask.push_back(0);
}
attrs.beginDims = getInputShapeAtPort(BEGIN_ID).getStaticDims();
attrs.endDims = getInputShapeAtPort(END_ID).getStaticDims();
if (attrs.beginDims.size() != 1)
THROW_ERROR << " should have begin vector with 1 dimension";
if (attrs.beginDims.size() != 1)
THROW_ERROR << "should have end vector with 1 dimension";
if (attrs.beginDims[0] != attrs.endDims[0])
THROW_ERROR << "should have begin vector with size equal to end vector size";
if (inputShapes.size() > STRIDE_ID) {
isStrideSpecified = true;
attrs.strideDims = getInputShapeAtPort(STRIDE_ID).getStaticDims();
if (attrs.strideDims.size() > 1)
THROW_ERROR << "should have stride vector with 1 dimension";
if (attrs.beginDims[0] != attrs.strideDims[0])
THROW_ERROR << "should have stride vector with size equal to begin vector size";
}
}
void MKLDNNStridedSliceNode::getSupportedDescriptors() {
auto isConstantNode = [](const MKLDNNNodePtr &node) {
return node->getType() == Input && node->isConstant();
};
params.parametersAreConstant = isConstantNode(getParentEdgesAtPort(BEGIN_ID)[0]->getParent()) &&
isConstantNode(getParentEdgesAtPort(END_ID)[0]->getParent());
const SizeVector srcDims = inputShapes[DATA_ID].getStaticDims();
const SizeVector dstDims = outputShapes[0].getStaticDims();
const size_t nSrcDims = srcDims.size();
const size_t nDims = std::max(nSrcDims, dstDims.size());
if (getParentEdges().size() != 3 && getParentEdges().size() != 4)
THROW_ERROR << "has incorrect number of input edges";
if (!getChildEdges().size())
THROW_ERROR << "has incorrect number of output edges";
beginDims = inputShapes[BEGIN_ID].getStaticDims();
if (beginDims.size() != 1)
THROW_ERROR << " should have begin vector with 1 dimension";
endDims = inputShapes[END_ID].getStaticDims();
if (endDims.size() != 1)
THROW_ERROR << "should have end vector with 1 dimension";
if (beginDims[0] != endDims[0])
THROW_ERROR << "should have begin vector with size equal to end vector size";
if (inputShapes.size() > STRIDE_ID) {
if (!isConstantNode(getParentEdgesAtPort(STRIDE_ID)[0]->getParent()))
params.parametersAreConstant = false;
strideDims = inputShapes[STRIDE_ID].getStaticDims();
if (strideDims.size() > 1)
THROW_ERROR << "should have stride vector with 1 dimension";
if (beginDims[0] != strideDims[0])
THROW_ERROR << "should have stride vector with size equal to begin vector size";
}
const size_t inputRank = getInputShapeAtPort(DATA_ID).getRank();
const size_t outputRank = getOutputShapeAtPort(0).getRank();
const size_t nDims = std::max(inputRank, outputRank);
int ellipsisMaskCounter = 0;
params.ellipsisPos1 = -1;
for (size_t i = 0; i < ellipsisMask.size(); i++) {
ellipsisMaskCounter += ellipsisMask[i];
params.ellipsisPos1 = ellipsisMask[i] == 1 && params.ellipsisPos1 == -1 ? i : params.ellipsisPos1;
int ellipsisPos1 = -1;
for (size_t i = 0; i < attrs.ellipsisMask.size(); i++) {
ellipsisMaskCounter += attrs.ellipsisMask[i];
ellipsisPos1 = attrs.ellipsisMask[i] == 1 && ellipsisPos1 == -1 ? i : ellipsisPos1;
}
if (ellipsisMaskCounter > 1)
THROW_ERROR << "has incorrect 'Ellipsis_mask'. Only one non-zero bit is allowed";
int newAxis = std::accumulate(newAxisMask.begin(), newAxisMask.end(), 0);
int shrinkAxis = std::accumulate(shrinkAxisMask.begin(), shrinkAxisMask.end(), 0);
params.equalDims = newAxis == 0 && shrinkAxis == 0;
int newAxis = std::accumulate(attrs.newAxisMask.begin(), attrs.newAxisMask.end(), 0);
int shrinkAxis = std::accumulate(attrs.shrinkAxisMask.begin(), attrs.shrinkAxisMask.end(), 0);
attrs.equalDims = newAxis == 0 && shrinkAxis == 0;
if (params.parametersAreConstant) {
auto fillingInParameters = [&](std::vector<int> &parameter, const size_t type, const size_t size, const int value) {
const auto constNode = std::dynamic_pointer_cast<MKLDNNInputNode>(getParentEdgesAtPort(type)[0]->getParent());
if (!constNode) {
THROW_ERROR << "can't cast node on " << type << " port to MKLDNNInputNode";
}
auto blob = constNode->getMemoryPtr();
if (blob->GetDataType() != mkldnn::memory::data_type::s32)
THROW_ERROR << "supports only parameters input with precision I32";
const int *ptr = static_cast<const int*>(blob->GetPtr());
parameter.assign(ptr, ptr + size);
auto fillingInParameters = [&](std::vector<int> &parameter, const size_t type, const size_t size, const int value) {
const auto constNode = std::dynamic_pointer_cast<MKLDNNInputNode>(getParentEdgesAtPort(type)[0]->getParent());
if (!constNode) {
THROW_ERROR << "can't cast node on " << type << " port to MKLDNNInputNode";
}
auto blob = constNode->getMemoryPtr();
if (blob->GetDataType() != mkldnn::memory::data_type::s32)
THROW_ERROR << "supports only parameters input with precision I32";
const int *ptr = static_cast<const int*>(blob->GetPtr());
parameter.assign(ptr, ptr + size);
if (ellipsisMaskCounter == 0 && size < nDims) {
for (size_t i = size; i < nDims; i++) parameter.push_back(value);
}
};
if (ellipsisMaskCounter == 0 && size < nDims) {
for (size_t i = size; i < nDims; i++) parameter.push_back(value);
}
};
if (beginDims.size())
fillingInParameters(begin, BEGIN_ID, beginDims[0], 0);
if (endDims.size())
fillingInParameters(end, END_ID, endDims[0], 0);
if (strideDims.size())
fillingInParameters(stride, STRIDE_ID, strideDims[0], 1);
if (attrs.beginDims.size())
fillingInParameters(attrs.begin, BEGIN_ID, attrs.beginDims[0], 0);
if (attrs.endDims.size())
fillingInParameters(attrs.end, END_ID, attrs.endDims[0], 0);
if (attrs.strideDims.size())
fillingInParameters(attrs.stride, STRIDE_ID, attrs.strideDims[0], 1);
if (nSrcDims > 3 && params.equalDims && ellipsisMaskCounter == 1)
addHiddenDims(nSrcDims);
}
if (inputRank > 3 && attrs.equalDims && ellipsisMaskCounter == 1)
addHiddenDims(inputRank, ellipsisPos1);
}
void MKLDNNStridedSliceNode::addHiddenDims(const size_t nSrcDims) {
void MKLDNNStridedSliceNode::addHiddenDims(const size_t nSrcDims, int ellipsisPos1) {
// all masks and input parameters are for planar layouts. So if we use blocked or per channel layout and
// there is ellipsis should to add default values in hidden dimensions to know real order of mask or parameter values
size_t afterDims = ellipsisMask.size() - params.ellipsisPos1 - 1;
size_t afterDims = attrs.ellipsisMask.size() - ellipsisPos1 - 1;
size_t ellipsisPos2 = nSrcDims - afterDims - 1;
auto addHiddenDims = [&](std::vector<int>& data, const int bit = 0) {
std::vector<int> temp;
for (size_t i = 0; i < params.ellipsisPos1; i++)
for (size_t i = 0; i < ellipsisPos1; i++)
temp.push_back(data[i]);
for (size_t i = params.ellipsisPos1; i < ellipsisPos2 + 1; i++)
for (size_t i = ellipsisPos1; i < ellipsisPos2 + 1; i++)
temp.push_back(bit);
for (size_t i = 1; i < nSrcDims - ellipsisPos2; i++)
temp.push_back(data[i + params.ellipsisPos1]);
temp.push_back(data[i + ellipsisPos1]);
data = temp;
};
addHiddenDims(begin);
addHiddenDims(end);
addHiddenDims(stride, 1);
addHiddenDims(beginMask);
addHiddenDims(endMask);
addHiddenDims(ellipsisMask);
addHiddenDims(newAxisMask);
addHiddenDims(shrinkAxisMask);
addHiddenDims(attrs.begin);
addHiddenDims(attrs.end);
addHiddenDims(attrs.stride, 1);
addHiddenDims(attrs.beginMask);
addHiddenDims(attrs.endMask);
addHiddenDims(attrs.ellipsisMask);
addHiddenDims(attrs.newAxisMask);
addHiddenDims(attrs.shrinkAxisMask);
}
void MKLDNNStridedSliceNode::initSupportedPrimitiveDescriptors() {
if (!supportedPrimitiveDescriptors.empty())
return;
const bool hasStrides = getParentEdges().size() > 3;
InferenceEngine::Precision dataPrecision = getOriginalInputPrecisionAtPort(DATA_ID);
InferenceEngine::Precision beginPrecision = getOriginalInputPrecisionAtPort(BEGIN_ID);
InferenceEngine::Precision endPrecision = getOriginalInputPrecisionAtPort(END_ID);
InferenceEngine::Precision stridePrecision;
if (hasStrides)
if (isStrideSpecified)
stridePrecision = getOriginalInputPrecisionAtPort(STRIDE_ID);
attrs.dataSize = dataPrecision.size();
auto srcDims = getInputShapeAtPort(DATA_ID).getStaticDims();
auto dstDims = getOutputShapeAtPort(0).getStaticDims();
size_t nDims = srcDims.size();
size_t nDims = getInputShapeAtPort(DATA_ID).getRank();
NodeConfig config;
config.dynBatchSupport = false;
@ -222,18 +213,21 @@ void MKLDNNStridedSliceNode::initSupportedPrimitiveDescriptors() {
config.inConfs[DATA_ID].constant = false;
config.inConfs[BEGIN_ID].constant = true;
config.inConfs[END_ID].constant = true;
if (hasStrides) {
if (isStrideSpecified) {
config.inConfs[STRIDE_ID].inPlace = -1;
config.inConfs[STRIDE_ID].constant = true;
}
config.outConfs.resize(1);
std::vector<LayoutType> supportedTypes;
if (nDims > 2 && params.equalDims) {
auto canUseBlocked = [=](const size_t blockSize) {
auto channelBeginNormalized = begin[1] > 0 ? begin[1] : begin[1] + srcDims[1];
return srcDims[1] % blockSize == 0 && abs(stride[1]) == 1 &&
(channelBeginNormalized > srcDims[1] || channelBeginNormalized % blockSize == 0 || channelBeginNormalized < 0 || beginMask[1] == 0);
if (nDims > 2 && attrs.equalDims) {
auto canUseBlocked = [&](const size_t blockSize) {
const auto& srcDims = getInputShapeAtPort(DATA_ID).getDims();
if (srcDims[1] == Shape::UNDEFINED_DIM)
return false;
auto channelBeginNormalized = attrs.begin[1] > 0 ? attrs.begin[1] : attrs.begin[1] + srcDims[1];
return srcDims[1] % blockSize == 0 && abs(attrs.stride[1]) == 1 &&
(channelBeginNormalized > srcDims[1] || channelBeginNormalized % blockSize == 0 || channelBeginNormalized < 0 || attrs.beginMask[1] == 0);
};
supportedTypes.push_back(LayoutType::nspc);
@ -250,7 +244,7 @@ void MKLDNNStridedSliceNode::initSupportedPrimitiveDescriptors() {
config.inConfs[0].desc = itr->second->createSharedDesc(dataPrecision, getInputShapeAtPort(DATA_ID));
config.inConfs[BEGIN_ID].desc = creators.at(LayoutType::ncsp)->createSharedDesc(beginPrecision, getInputShapeAtPort(BEGIN_ID));
config.inConfs[END_ID].desc = creators.at(LayoutType::ncsp)->createSharedDesc(endPrecision, getInputShapeAtPort(END_ID));
if (hasStrides)
if (isStrideSpecified)
config.inConfs[STRIDE_ID].desc = creators.at(LayoutType::ncsp)->createSharedDesc(stridePrecision, getInputShapeAtPort(STRIDE_ID));
config.outConfs[0].desc = itr->second->createSharedDesc(dataPrecision, getOutputShapeAtPort(DATA_ID));
@ -268,45 +262,39 @@ void MKLDNNStridedSliceNode::createPrimitive() {
if (getSelectedPrimitiveDescriptor() == nullptr)
THROW_ERROR << "has unidentified preferable primitive descriptor.";
auto srcBlockingDesc = getParentEdgeAt(DATA_ID)->getMemory().GetDescWithType<BlockedMemoryDesc>();
auto dstBlockingDesc = getChildEdgeAt(0)->getMemory().GetDescWithType<BlockedMemoryDesc>();
auto srcOrder = srcBlockingDesc->getOrder();
params.srcDims = srcBlockingDesc->getBlockDims();
params.dstDims = dstBlockingDesc->getBlockDims();
params.srcMemPtr = srcMemPtr;
params.dstMemPtr = dstMemPtr;
params.dataSize = getSelectedPrimitiveDescriptor()->getConfig().inConfs[DATA_ID].desc->getPrecision().size();
if (!srcMemPtr->getDesc().hasLayoutType(LayoutType::ncsp))
orderParametersByLayouts(srcMemPtr);
if (params.parametersAreConstant) {
size_t realNDims = params.dstDims.size();
if (!getParentEdgeAt(DATA_ID)->getMemory().getDesc().hasLayoutType(LayoutType::ncsp))
orderParametersByLayouts();
SizeVector newSrcDims, newDstDims;
dimsNormalization(newSrcDims, newDstDims);
dimsGluing(realNDims, newSrcDims, newDstDims);
indicesCalculation();
if (inputShapesDefined()) {
prepareParams();
updateLastInputDims();
}
}
void MKLDNNStridedSliceNode::orderParametersByLayouts() {
const bool isPerChannelLayout = getParentEdgeAt(DATA_ID)->getMemory().getDesc().hasLayoutType(LayoutType::nspc);
const bool isBlockedLayout = getParentEdgeAt(DATA_ID)->getMemory().getDesc().hasLayoutType(LayoutType::nCsp8c) ||
getParentEdgeAt(DATA_ID)->getMemory().getDesc().hasLayoutType(LayoutType::nCsp16c);
auto srcOrder = getParentEdgeAt(DATA_ID)->getMemory().GetDescWithType<BlockedMemoryDesc>()->getOrder();
void MKLDNNStridedSliceNode::orderParametersByLayouts(const MKLDNNMemoryPtr& srcMemPtr) {
size_t blk = 1;
bool isBlockedLayout = false;
if (srcMemPtr->getDesc().hasLayoutType(LayoutType::nCsp16c)) {
isBlockedLayout = true;
blk = 16;
} else if (srcMemPtr->getDesc().hasLayoutType(LayoutType::nCsp8c)) {
isBlockedLayout = true;
blk = 8;
}
const bool isPerChannelLayout = srcMemPtr->getDesc().hasLayoutType(LayoutType::nspc);
auto srcOrder = srcMemPtr->GetDescWithType<BlockedMemoryDesc>()->getOrder();
if (isBlockedLayout) {
const size_t blk = params.srcDims.back();
begin[1] = begin[1] / blk;
end[1] = ceil(end[1] / static_cast<float>(blk));
begin.push_back(0);
end.push_back(0);
stride.push_back(1);
beginMask.push_back(0);
endMask.push_back(0);
ellipsisMask.push_back(0);
newAxisMask.push_back(0);
shrinkAxisMask.push_back(0);
attrs.begin[1] = attrs.begin[1] / blk;
attrs.end[1] = ceil(attrs.end[1] / static_cast<float>(blk));
attrs.begin.push_back(0);
attrs.end.push_back(0);
attrs.stride.push_back(1);
attrs.beginMask.push_back(0);
attrs.endMask.push_back(0);
attrs.ellipsisMask.push_back(0);
attrs.newAxisMask.push_back(0);
attrs.shrinkAxisMask.push_back(0);
} else if (isPerChannelLayout) {
auto sortByOrder = [&](std::vector<int>& data) {
std::vector<int> temp(srcOrder.size());
@ -315,18 +303,38 @@ void MKLDNNStridedSliceNode::orderParametersByLayouts() {
data = temp;
};
sortByOrder(begin);
sortByOrder(end);
sortByOrder(stride);
sortByOrder(beginMask);
sortByOrder(endMask);
sortByOrder(ellipsisMask);
sortByOrder(newAxisMask);
sortByOrder(shrinkAxisMask);
sortByOrder(attrs.begin);
sortByOrder(attrs.end);
sortByOrder(attrs.stride);
sortByOrder(attrs.beginMask);
sortByOrder(attrs.endMask);
sortByOrder(attrs.ellipsisMask);
sortByOrder(attrs.newAxisMask);
sortByOrder(attrs.shrinkAxisMask);
}
}
void MKLDNNStridedSliceNode::dimsNormalization(SizeVector& newSrcDims, SizeVector& newDstDims) {
void MKLDNNStridedSliceNode::prepareParams() {
execPtr = std::make_shared<StridedSliceExecutor>(attrs,
getParentEdgeAt(0)->getMemoryPtr()->GetDescWithType<BlockedMemoryDesc>()->getBlockDims(),
getChildEdgeAt(0)->getMemoryPtr()->GetDescWithType<BlockedMemoryDesc>()->getBlockDims());
}
MKLDNNStridedSliceNode::StridedSliceExecutor::StridedSliceExecutor(const StridedSliceAttributes& attrs,
const VectorDims& srcBlockedDims,
const VectorDims& dstBlockedDims) {
StridedSliceParams params;
params.srcBlockedDims = srcBlockedDims;
params.dstBlockedDims = dstBlockedDims;
params.attrs = attrs;
size_t realNDims = params.dstBlockedDims.size();
dimsNormalization(params);
dimsGluing(params, realNDims);
indicesCalculation(params);
}
void MKLDNNStridedSliceNode::StridedSliceExecutor::dimsNormalization(StridedSliceParams& params) {
// creating new src and dst dimensions and parameters of the same size using masks
//
// example 1: before srcDims = [5, 6, 8, 3, 2], begin = [1, 0], end = [4, 0], stride = [1, 1]
@ -352,66 +360,67 @@ void MKLDNNStridedSliceNode::dimsNormalization(SizeVector& newSrcDims, SizeVecto
dim = dim >= 0 ? dim : shift + dim;
};
VectorDims newSrcDims, newDstDims;
std::vector<int> beginTemp;
std::vector<int> endTemp;
std::vector<int> strideTemp;
size_t srcIdx = 0;
for (size_t axis = 0; axis < begin.size(); ++axis) {
if (ellipsisMask[axis] == 1) {
for (size_t axis = 0; axis < params.attrs.begin.size(); ++axis) {
if (params.attrs.ellipsisMask[axis] == 1) {
int nNewAxisAfterEllipses = 0;
int nSrcAxisBeforeEllipses = 0;
for (size_t i = 0; i < axis; ++i) {
if (newAxisMask[i] != 1)
if (params.attrs.newAxisMask[i] != 1)
nSrcAxisBeforeEllipses++;
}
for (size_t i = axis + 1; i < begin.size(); ++i) {
if (newAxisMask[i] == 1)
for (size_t i = axis + 1; i < params.attrs.begin.size(); ++i) {
if (params.attrs.newAxisMask[i] == 1)
nNewAxisAfterEllipses++;
}
size_t nSrcAxisAfterEllipses = (begin.size() - axis - nNewAxisAfterEllipses - 1);
size_t nHiddenDims = params.srcDims.size() - nSrcAxisAfterEllipses - nSrcAxisBeforeEllipses;
size_t nSrcAxisAfterEllipses = (params.attrs.begin.size() - axis - nNewAxisAfterEllipses - 1);
size_t nHiddenDims = params.srcBlockedDims.size() - nSrcAxisAfterEllipses - nSrcAxisBeforeEllipses;
for (size_t i = 0; i < nHiddenDims; ++i) {
newSrcDims.push_back(params.srcDims[srcIdx]);
newDstDims.push_back(params.srcDims[srcIdx]);
newSrcDims.push_back(params.srcBlockedDims[srcIdx]);
newDstDims.push_back(params.srcBlockedDims[srcIdx]);
beginTemp.push_back(0);
endTemp.push_back(params.srcDims[srcIdx] - 1);
endTemp.push_back(params.srcBlockedDims[srcIdx] - 1);
strideTemp.push_back(1);
srcIdx++;
}
} else {
if (newAxisMask[axis] == 1) {
if (params.attrs.newAxisMask[axis] == 1) {
beginTemp.push_back(0);
endTemp.push_back(0);
strideTemp.push_back(1);
newSrcDims.push_back(1);
newDstDims.push_back(1);
} else if (shrinkAxisMask[axis] == 1) {
int b = beginMask[axis] == 1 ? begin[axis] : 0;
correcting(b, params.srcDims[srcIdx]);
clipping(b, 0, params.srcDims[srcIdx]);
} else if (params.attrs.shrinkAxisMask[axis] == 1) {
int b = params.attrs.beginMask[axis] == 1 ? params.attrs.begin[axis] : 0;
correcting(b, params.srcBlockedDims[srcIdx]);
clipping(b, 0, params.srcBlockedDims[srcIdx]);
beginTemp.push_back(b);
endTemp.push_back(b);
strideTemp.push_back(1);
newSrcDims.push_back(params.srcDims[srcIdx]);
newSrcDims.push_back(params.srcBlockedDims[srcIdx]);
newDstDims.push_back(1);
srcIdx++;
} else {
int b = beginMask[axis] == 1 ? begin[axis] : (stride[axis] > 0 ? 0 : -1);
correcting(b, params.srcDims[srcIdx]);
clipping(b, 0, params.srcDims[srcIdx]);
int b = params.attrs.beginMask[axis] == 1 ? params.attrs.begin[axis] : (params.attrs.stride[axis] > 0 ? 0 : -1);
correcting(b, params.srcBlockedDims[srcIdx]);
clipping(b, 0, params.srcBlockedDims[srcIdx]);
int e = endMask[axis] == 1 ? (stride[axis] > 0 ? end[axis] - 1 : end[axis] + 1) :
(stride[axis] > 0 ? -1 : 0);
correcting(e, params.srcDims[srcIdx]);
clipping(e, 0, params.srcDims[srcIdx]);
int e = params.attrs.endMask[axis] == 1 ? (params.attrs.stride[axis] > 0 ? params.attrs.end[axis] - 1 : params.attrs.end[axis] + 1) :
(params.attrs.stride[axis] > 0 ? -1 : 0);
correcting(e, params.srcBlockedDims[srcIdx]);
clipping(e, 0, params.srcBlockedDims[srcIdx]);
beginTemp.push_back(b);
endTemp.push_back(e);
strideTemp.push_back(stride[axis]);
newSrcDims.push_back(params.srcDims[srcIdx]);
strideTemp.push_back(params.attrs.stride[axis]);
newSrcDims.push_back(params.srcBlockedDims[srcIdx]);
newDstDims.push_back(ceil(static_cast<float>(abs(e - b) + 1) / static_cast<float>(abs(strideTemp.back()))));
srcIdx++;
@ -419,36 +428,36 @@ void MKLDNNStridedSliceNode::dimsNormalization(SizeVector& newSrcDims, SizeVecto
}
}
begin = beginTemp;
end = endTemp;
stride = strideTemp;
params.attrs.begin = beginTemp;
params.attrs.end = endTemp;
params.attrs.stride = strideTemp;
params.dstDims = newDstDims;
params.srcDims = newSrcDims;
params.dstBlockedDims = newDstDims;
params.srcBlockedDims = newSrcDims;
params.dstStrides.resize(newDstDims.size());
params.srcStrides.resize(newSrcDims.size());
params.dstStrides[params.dstStrides.size() - 1] = params.srcStrides[params.srcStrides.size() - 1] = 1;
for (int i = newDstDims.size() - 2; i >= 0; --i) {
params.dstStrides[i] = params.dstStrides[i + 1] * params.dstDims[i + 1];
params.srcStrides[i] = params.srcStrides[i + 1] * params.srcDims[i + 1];
params.dstStrides[i] = params.dstStrides[i + 1] * params.dstBlockedDims[i + 1];
params.srcStrides[i] = params.srcStrides[i + 1] * params.srcBlockedDims[i + 1];
}
}
void MKLDNNStridedSliceNode::dimsGluing(const size_t realNDims, const SizeVector& newSrcDims, const SizeVector& newDstDims) {
void MKLDNNStridedSliceNode::StridedSliceExecutor::dimsGluing(StridedSliceParams& params, const size_t realNDims) {
// gluing of dimensions if there aren't begin, end and stride != 1 on this axis
// example: before gluing srcDims = [5, 6, 8, 3, 2], begin = [1, 0, 0, 0, 0], stride = [1, 1, 2, 1, 1], dstDims = [4, 6, 4, 3, 2]
// after gluing srcDims = [30, 8, 6], begin = [6, 0, 0], stride = [1, 2, 1], dstDims = [24, 4, 6]
std::pair<size_t, size_t> secondDim = { 0, begin.size() };
SizeVector indexes(1, 0);
for (int idx = 0; idx < begin.size(); idx++) {
if (begin[idx] != 0 || end[idx] != params.srcDims[idx] - 1 || stride[idx] != 1) {
std::pair<size_t, size_t> secondDim = { 0, params.attrs.begin.size() };
VectorDims indexes(1, 0);
for (int idx = 0; idx < params.attrs.begin.size(); idx++) {
if (params.attrs.begin[idx] != 0 || params.attrs.end[idx] != params.srcBlockedDims[idx] - 1 || params.attrs.stride[idx] != 1) {
indexes.push_back(std::max(idx - 1, 0));
indexes.push_back(stride[idx] == 1 ? idx : idx + 1);
indexes.push_back(params.attrs.stride[idx] == 1 ? idx : idx + 1);
if (idx != 0 && secondDim.first == 0)
secondDim.first = idx;
else if (idx != 0 && secondDim.second == begin.size())
else if (idx != 0 && secondDim.second == params.attrs.begin.size())
secondDim.second = idx;
}
}
@ -458,111 +467,113 @@ void MKLDNNStridedSliceNode::dimsGluing(const size_t realNDims, const SizeVector
secondDim.first = 1;
}
const VectorDims srcBlockedDimsBefore = params.srcBlockedDims;
const VectorDims dstBlockedDimsBefore = params.dstBlockedDims;
const size_t nGluingLastDims = params.dstStrides[std::max(static_cast<int>(indexes.back() - 1), 0)];
const bool vLastDim = indexes.back() < begin.size();
indexes[indexes.size() - 1] = vLastDim ? indexes.back() : begin.size() - 1;
indexes.push_back(begin.size() - 1);
const bool vLastDim = indexes.back() < params.attrs.begin.size();
indexes[indexes.size() - 1] = vLastDim ? indexes.back() : params.attrs.begin.size() - 1;
indexes.push_back(params.attrs.begin.size() - 1);
for (int idx = indexes.size() - 1; idx >= 0; idx -= 2) {
if (indexes[idx - 1] < indexes[idx]) {
for (size_t jdx = indexes[idx]; jdx > indexes[idx - 1]; --jdx) {
params.dstDims[indexes[idx - 1]] *= params.dstDims[jdx];
params.srcDims[indexes[idx - 1]] *= params.srcDims[jdx];
params.dstStrides[indexes[idx - 1]] /= params.dstDims[jdx];
params.srcStrides[indexes[idx - 1]] /= params.srcDims[jdx];
params.dstBlockedDims[indexes[idx - 1]] *= params.dstBlockedDims[jdx];
params.srcBlockedDims[indexes[idx - 1]] *= params.srcBlockedDims[jdx];
params.dstStrides[indexes[idx - 1]] /= params.dstBlockedDims[jdx];
params.srcStrides[indexes[idx - 1]] /= params.srcBlockedDims[jdx];
begin[indexes[idx - 1]] *= params.dstDims[jdx];
params.attrs.begin[indexes[idx - 1]] *= params.dstBlockedDims[jdx];
}
const size_t beginShift = indexes[idx - 1] + 1;
const size_t endShift = indexes[idx] + 1;
params.dstDims.erase(params.dstDims.begin() + beginShift, params.dstDims.begin() + endShift);
params.srcDims.erase(params.srcDims.begin() + beginShift, params.srcDims.begin() + endShift);
params.dstBlockedDims.erase(params.dstBlockedDims.begin() + beginShift, params.dstBlockedDims.begin() + endShift);
params.srcBlockedDims.erase(params.srcBlockedDims.begin() + beginShift, params.srcBlockedDims.begin() + endShift);
params.dstStrides.erase(params.dstStrides.begin() + beginShift, params.dstStrides.begin() + endShift);
params.srcStrides.erase(params.srcStrides.begin() + beginShift, params.srcStrides.begin() + endShift);
begin.erase(begin.begin() + beginShift, begin.begin() + endShift);
stride.erase(stride.begin() + beginShift, stride.begin() + endShift);
params.attrs.begin.erase(params.attrs.begin.begin() + beginShift, params.attrs.begin.begin() + endShift);
params.attrs.stride.erase(params.attrs.stride.begin() + beginShift, params.attrs.stride.begin() + endShift);
}
}
params.workAmount = params.dstDims[0] * params.dstStrides[0] / nGluingLastDims;
params.lastDstDim = nGluingLastDims * params.dataSize;
params.nDimsForWork = params.dstDims.size() - static_cast<size_t>(vLastDim);
workAmount = params.dstBlockedDims[0] * params.dstStrides[0] / nGluingLastDims;
lastDstDim = nGluingLastDims * params.attrs.dataSize;
params.nDimsForWork = params.dstBlockedDims.size() - static_cast<size_t>(vLastDim);
if (params.nDimsForWork == 1 && realNDims > 2) {
const size_t realSrcDim = newSrcDims[secondDim.first];
const size_t realDstDim = newDstDims[secondDim.first];
const size_t realSrcDim = srcBlockedDimsBefore[secondDim.first];
const size_t realDstDim = dstBlockedDimsBefore[secondDim.first];
params.dstStrides.insert(params.dstStrides.begin() + 1, params.dstStrides[0] / realDstDim);
params.srcStrides.insert(params.srcStrides.begin() + 1, params.srcStrides[0] / realSrcDim);
for (size_t idx = secondDim.first + 1; idx < secondDim.second; idx++)
begin[1] /= newDstDims[idx];
params.attrs.begin[1] /= dstBlockedDimsBefore[idx];
const size_t maxThreads = parallel_get_max_threads();
if (params.dstDims[0] < maxThreads) {
params.dstDims[1] /= realDstDim;
params.srcDims[1] /= realSrcDim;
params.dstDims.insert(params.dstDims.begin() + 1, realDstDim);
params.srcDims.insert(params.srcDims.begin() + 1, realSrcDim);
if (params.dstBlockedDims[0] < maxThreads) {
params.dstBlockedDims[1] /= realDstDim;
params.srcBlockedDims[1] /= realSrcDim;
params.dstBlockedDims.insert(params.dstBlockedDims.begin() + 1, realDstDim);
params.srcBlockedDims.insert(params.srcBlockedDims.begin() + 1, realSrcDim);
}
if (params.dstDims.size() > 2)
params.lastDstDim /= newDstDims[secondDim.first];
if (params.dstBlockedDims.size() > 2)
lastDstDim /= dstBlockedDimsBefore[secondDim.first];
}
// some parameter calculations for common execution
params.isOptimized = params.nDimsForWork == 1 && params.dstDims.size() > 1;
params.isOptimized = params.nDimsForWork == 1 && params.dstBlockedDims.size() > 1;
if (params.isOptimized) {
if (params.dstDims.size() == 2)
params.dstDims[1] = 1;
if (params.dstBlockedDims.size() == 2)
params.dstBlockedDims[1] = 1;
params.workAmount = params.dstDims[0] * params.dstDims[1];
params.srcShift = (begin[0] * params.srcStrides[0] + begin[1] * params.srcStrides[1]) * params.dataSize;
workAmount = params.dstBlockedDims[0] * params.dstBlockedDims[1];
srcShift = (params.attrs.begin[0] * params.srcStrides[0] + params.attrs.begin[1] * params.srcStrides[1]) * params.attrs.dataSize;
} else {
params.srcShift = stride.back() == 1 && stride.size() > 1 ?
begin[params.nDimsForWork] * params.srcStrides[params.nDimsForWork] * params.dataSize : 0;
srcShift = params.attrs.stride.back() == 1 && params.attrs.stride.size() > 1 ?
params.attrs.begin[params.nDimsForWork] * params.srcStrides[params.nDimsForWork] * params.attrs.dataSize : 0;
}
}
void MKLDNNStridedSliceNode::indicesCalculation() {
void MKLDNNStridedSliceNode::StridedSliceExecutor::indicesCalculation(const StridedSliceParams& params) {
// indices calculation before execution for the best performance
params.srcIndices.resize(params.workAmount, 0);
params.dstIndices.resize(params.workAmount, 0);
srcIndices.resize(workAmount, 0);
dstIndices.resize(workAmount, 0);
// should choose more optimal thread count
const size_t nthr = parallel_get_max_threads();
params.nThreads = nthr > params.workAmount ? params.workAmount : nthr;
nThreads = nthr > workAmount ? workAmount : nthr;
if (params.isOptimized) {
indicesCalculationForOptimized();
indicesCalculationForOptimized(params);
return;
}
auto getSrcIdx = [this](const SizeVector& indexes){
auto getSrcIdx = [&](const VectorDims& indexes){
size_t srcIdx = 0;
for (int i = 0; i < params.nDimsForWork; ++i)
srcIdx += (begin[i] + indexes[i] * stride[i]) * params.srcStrides[i];
return srcIdx * params.dataSize;
srcIdx += (params.attrs.begin[i] + indexes[i] * params.attrs.stride[i]) * params.srcStrides[i];
return srcIdx * params.attrs.dataSize;
};
parallel_nt(params.nThreads, [&](const int ithr, const int nthr) {
parallel_nt(nThreads, [&](const int ithr, const int nthr) {
size_t start = 0, end = 0;
SizeVector coords(params.nDimsForWork, 0);
splitter(params.workAmount, nthr, ithr, start, end);
parallel_init(start, params.nDimsForWork, params.dstDims, coords);
VectorDims coords(params.nDimsForWork, 0);
splitter(workAmount, nthr, ithr, start, end);
parallel_init(start, params.nDimsForWork, params.dstBlockedDims, coords);
size_t srcIdx = getSrcIdx(coords);
for (size_t j = start; j < end; ++j) {
params.dstIndices[j] = j * params.lastDstDim;
params.srcIndices[j] = srcIdx;
dstIndices[j] = j * lastDstDim;
srcIndices[j] = srcIdx;
bool out = false;
for (int k = params.nDimsForWork - 1; k >= 0; k--) {
coords[k]++;
if (coords[k] < params.dstDims[k]) {
srcIdx += stride[k] * params.srcStrides[k] * params.dataSize;
if (coords[k] < params.dstBlockedDims[k]) {
srcIdx += params.attrs.stride[k] * params.srcStrides[k] * params.attrs.dataSize;
break;
}
@ -576,76 +587,49 @@ void MKLDNNStridedSliceNode::indicesCalculation() {
});
}
void MKLDNNStridedSliceNode::indicesCalculationForOptimized() {
const size_t dstIdx0 = params.dstStrides[0] * params.dataSize;
const size_t dstIdx1 = params.dstStrides[1] * params.dataSize;
const size_t srcIdx0 = stride[0] * params.srcStrides[0] * params.dataSize;
const size_t srcIdx1 = stride[1] * params.srcStrides[1] * params.dataSize;
void MKLDNNStridedSliceNode::StridedSliceExecutor::indicesCalculationForOptimized(const StridedSliceParams& params) {
const size_t dstIdx0 = params.dstStrides[0] * params.attrs.dataSize;
const size_t dstIdx1 = params.dstStrides[1] * params.attrs.dataSize;
const size_t srcIdx0 = params.attrs.stride[0] * params.srcStrides[0] * params.attrs.dataSize;
const size_t srcIdx1 = params.attrs.stride[1] * params.srcStrides[1] * params.attrs.dataSize;
for (size_t i0 = 0; i0 < params.dstDims[0]; i0++) {
const size_t idx = i0 * params.dstDims[1];
for (size_t i0 = 0; i0 < params.dstBlockedDims[0]; i0++) {
const size_t idx = i0 * params.dstBlockedDims[1];
params.dstIndices[idx] = i0 * dstIdx0;
params.srcIndices[idx] = i0 * srcIdx0;
dstIndices[idx] = i0 * dstIdx0;
srcIndices[idx] = i0 * srcIdx0;
for (size_t i1 = 1; i1 < params.dstDims[1]; i1++) {
params.dstIndices[idx + i1] = params.dstIndices[idx] + i1 * dstIdx1;
params.srcIndices[idx + i1] = params.srcIndices[idx] + i1 * srcIdx1;
for (size_t i1 = 1; i1 < params.dstBlockedDims[1]; i1++) {
dstIndices[idx + i1] = dstIndices[idx] + i1 * dstIdx1;
srcIndices[idx + i1] = srcIndices[idx] + i1 * srcIdx1;
}
}
}
void MKLDNNStridedSliceNode::execute(mkldnn::stream strm) {
if (!params.parametersAreConstant) {
auto srcDims = getParentEdgeAt(DATA_ID)->getMemory().getStaticDims();
auto dstDims = getChildEdgesAtPort(DATA_ID)[0]->getMemory().getStaticDims();
const size_t nDims = std::max(srcDims.size(), dstDims.size());
const size_t ellipsisMaskCounter = std::accumulate(ellipsisMask.begin(), ellipsisMask.end(), 0);
auto fillingInParameters = [&](std::vector<int> &parameter, const size_t type, const size_t size, const int value) {
const int *ptr = reinterpret_cast<const int*>(this->getParentEdgeAt(type)->getMemoryPtr()->GetPtr());
parameter.assign(ptr, ptr + size);
if (ellipsisMaskCounter == 0 && size < nDims) {
for (size_t i = size; i < nDims; i++) parameter.push_back(value);
}
};
if (beginDims.size())
fillingInParameters(begin, BEGIN_ID, beginDims[0], 0);
if (endDims.size())
fillingInParameters(end, END_ID, endDims[0], 0);
if (strideDims.size())
fillingInParameters(stride, STRIDE_ID, strideDims[0], 1);
if (srcDims.size() > 3 && params.equalDims && ellipsisMaskCounter != 0)
addHiddenDims(srcDims.size());
if (!getParentEdgeAt(DATA_ID)->getMemory().getDesc().hasLayoutType(LayoutType::ncsp))
orderParametersByLayouts();
SizeVector newSrcDims, newDstDims;
dimsNormalization(newSrcDims, newDstDims);
dimsGluing(dstDims.size(), newSrcDims, newDstDims);
indicesCalculation();
}
stridedSlice();
}
inline void MKLDNNStridedSliceNode::stridedSlice() {
const uint8_t* srcData = reinterpret_cast<const uint8_t*>(params.srcMemPtr->GetPtr()) + params.srcShift;
uint8_t* dstData = reinterpret_cast<uint8_t*>(params.dstMemPtr->GetPtr());
parallel_nt(params.nThreads, [&](const int ithr, const int nthr) {
void MKLDNNStridedSliceNode::StridedSliceExecutor::exec(const uint8_t* srcData, uint8_t* dstData) {
const uint8_t* srcShiftedData = srcData + srcShift;
parallel_nt(nThreads, [&](const int ithr, const int nthr) {
size_t start = 0, end = 0;
splitter(params.workAmount, nthr, ithr, start, end);
splitter(workAmount, nthr, ithr, start, end);
for (size_t iwork = start; iwork < end; ++iwork)
cpu_memcpy(&dstData[params.dstIndices[iwork]], &srcData[params.srcIndices[iwork]], params.lastDstDim);
cpu_memcpy(&dstData[dstIndices[iwork]], &srcShiftedData[srcIndices[iwork]], lastDstDim);
});
}
void MKLDNNStridedSliceNode::execute(mkldnn::stream strm) {
if (!execPtr)
THROW_ERROR << "doesn't have compiled executor!";
const uint8_t* srcData = reinterpret_cast<const uint8_t*>(getParentEdgeAt(0)->getMemoryPtr()->GetPtr());
uint8_t* dstData = reinterpret_cast<uint8_t*>(getChildEdgeAt(0)->getMemoryPtr()->GetPtr());
execPtr->exec(srcData, dstData);
}
void MKLDNNStridedSliceNode::executeDynamicImpl(mkldnn::stream strm) {
execute(strm);
}
bool MKLDNNStridedSliceNode::created() const {
return getType() == StridedSlice;
}

View File

@ -15,6 +15,7 @@ class MKLDNNStridedSliceNode : public MKLDNNNode {
public:
MKLDNNStridedSliceNode(const std::shared_ptr<ngraph::Node>& op, const mkldnn::engine& eng, MKLDNNWeightsSharing::Ptr &cache);
static bool isSupportedOperation(const std::shared_ptr<const ngraph::Node>& op, std::string& errorMessage) noexcept;
void getSupportedDescriptors() override;
void initSupportedPrimitiveDescriptors() override;
void createPrimitive() override;
@ -24,58 +25,71 @@ public:
return false;
}
static bool isSupportedOperation(const std::shared_ptr<const ngraph::Node>& op, std::string& errorMessage) noexcept;
void prepareParams() override;
protected:
void executeDynamicImpl(mkldnn::stream strm) override;
private:
inline void stridedSlice();
void addHiddenDims(const size_t nSrcDims, int ellipsisPos1);
void orderParametersByLayouts(const MKLDNNMemoryPtr& srcMemPtr);
void addHiddenDims(const size_t nSrcDims);
void orderParametersByLayouts();
void dimsNormalization(InferenceEngine::SizeVector& newSrcDims, InferenceEngine::SizeVector& newDstDims);
void dimsGluing(const size_t realNDims, const InferenceEngine::SizeVector& newSrcDims, const InferenceEngine::SizeVector& newDstDims);
void indicesCalculation();
void indicesCalculationForOptimized();
struct StridedSliceAttributes {
std::vector<int> begin;
std::vector<int> end;
std::vector<int> stride;
const size_t DATA_ID = 0;
const size_t BEGIN_ID = 1;
const size_t END_ID = 2;
const size_t STRIDE_ID = 3;
std::vector<int> beginMask;
std::vector<int> endMask;
std::vector<int> ellipsisMask;
std::vector<int> newAxisMask;
std::vector<int> shrinkAxisMask;
std::vector<int> begin;
std::vector<int> end;
std::vector<int> stride;
VectorDims beginDims;
VectorDims endDims;
VectorDims strideDims;
std::vector<int> beginMask;
std::vector<int> endMask;
std::vector<int> ellipsisMask;
std::vector<int> newAxisMask;
std::vector<int> shrinkAxisMask;
InferenceEngine::SizeVector beginDims;
InferenceEngine::SizeVector endDims;
InferenceEngine::SizeVector strideDims;
struct {
MKLDNNMemoryPtr srcMemPtr = nullptr;
MKLDNNMemoryPtr dstMemPtr = nullptr;
InferenceEngine::SizeVector srcDims;
InferenceEngine::SizeVector dstDims;
InferenceEngine::SizeVector srcStrides;
InferenceEngine::SizeVector dstStrides;
InferenceEngine::SizeVector srcIndices;
InferenceEngine::SizeVector dstIndices;
int ellipsisPos1 = -1;
int ellipsisPos2 = 0;
size_t nThreads = 0;
size_t nDimsForWork = 0;
size_t workAmount = 0;
size_t lastDstDim = 0;
size_t dataSize = 0;
size_t srcShift = 0;
bool isOptimized = false;
bool equalDims = false;
bool parametersAreConstant = true;
} params;
size_t dataSize = 1lu;
} attrs;
struct StridedSliceExecutor {
StridedSliceExecutor(const StridedSliceAttributes& attrs, const VectorDims& srcBlockedDims, const VectorDims& dstBlockedDims);
void exec(const uint8_t* srcData, uint8_t* dstData);
~StridedSliceExecutor() = default;
private:
struct StridedSliceParams {
StridedSliceAttributes attrs;
VectorDims srcBlockedDims;
VectorDims dstBlockedDims;
VectorDims srcStrides;
VectorDims dstStrides;
size_t nDimsForWork = 0lu;
bool isOptimized = false;
};
void dimsNormalization(StridedSliceParams& params);
void dimsGluing(StridedSliceParams& params, const size_t realNDims);
void indicesCalculation(const StridedSliceParams& params);
void indicesCalculationForOptimized(const StridedSliceParams& params);
VectorDims srcIndices;
VectorDims dstIndices;
size_t nThreads = 0lu;
size_t workAmount = 0lu;
size_t lastDstDim = 0lu;
size_t srcShift = 0lu;
};
using executorPtr = std::shared_ptr<StridedSliceExecutor>;
executorPtr execPtr = nullptr;
bool isStrideSpecified = false;
static constexpr size_t DATA_ID = 0;
static constexpr size_t BEGIN_ID = 1;
static constexpr size_t END_ID = 2;
static constexpr size_t STRIDE_ID = 3;
};
} // namespace MKLDNNPlugin

View File

@ -5,70 +5,80 @@
#include <shared_test_classes/single_layer/strided_slice.hpp>
#include "ngraph_functions/builders.hpp"
#include "test_utils/cpu_test_utils.hpp"
#include "shared_test_classes/base/ov_subgraph.hpp"
using namespace InferenceEngine;
using namespace CPUTestUtils;
using namespace LayerTestsDefinitions;
using namespace ov;
using namespace test;
namespace CPULayerTestsDefinitions {
struct StridedSliceParams {
std::vector<int64_t> begin;
std::vector<int64_t> end;
std::vector<int64_t> strides;
std::vector<int64_t> beginMask;
std::vector<int64_t> endMask;
std::vector<int64_t> newAxisMask;
std::vector<int64_t> shrinkAxisMask;
std::vector<int64_t> ellipsisAxisMask;
};
typedef std::tuple<
StridedSliceSpecificParams,
InferenceEngine::Precision, // Net precision
std::string, // Device name
std::map<std::string, std::string>, // Additional network configuration
InputShape, // Input shapes
StridedSliceParams,
ElementType, // Element type
CPUSpecificParams> StridedSliceLayerCPUTestParamSet;
class StridedSliceLayerCPUTest : public testing::WithParamInterface<StridedSliceLayerCPUTestParamSet>,
virtual public LayerTestsUtils::LayerTestsCommon, public CPUTestsBase {
virtual public SubgraphBaseTest, public CPUTestsBase {
public:
static std::string getTestCaseName(testing::TestParamInfo<StridedSliceLayerCPUTestParamSet> obj) {
StridedSliceSpecificParams params;
InferenceEngine::Precision netPrc;
std::string targetName;
std::map<std::string, std::string> additionalConfig;
InputShape shapes;
StridedSliceParams params;
ElementType elementType;
CPUSpecificParams cpuParams;
std::tie(params, netPrc, targetName, additionalConfig, cpuParams) = obj.param;
std::tie(shapes, params, elementType, cpuParams) = obj.param;
std::ostringstream result;
result << "inShape=" << CommonTestUtils::vec2str(params.inputShape) << "_";
result << "netPRC=" << netPrc.name() << "_";
result << "begin=" << CommonTestUtils::vec2str(params.begin) << "_";
result << "end=" << CommonTestUtils::vec2str(params.end) << "_";
result << "stride=" << CommonTestUtils::vec2str(params.strides) << "_";
result << "begin_m=" << CommonTestUtils::vec2str(params.beginMask) << "_";
result << "end_m=" << CommonTestUtils::vec2str(params.endMask) << "_";
result << "new_axis_m=" << (params.newAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.newAxisMask)) << "_";
result << "shrink_m=" << (params.shrinkAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.shrinkAxisMask)) << "_";
result << "ellipsis_m=" << (params.ellipsisAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.ellipsisAxisMask)) << "_";
result << "trgDev=" << targetName;
result << CPUTestsBase::getTestCaseName(cpuParams);
std::ostringstream results;
results << "IS=" << CommonTestUtils::partialShape2str({shapes.first}) << "_";
results << "TS=";
for (const auto& item : shapes.second) {
results << CommonTestUtils::vec2str(item) << "_";
}
results << "netPRC=" << elementType << "_";
results << "begin=" << CommonTestUtils::vec2str(params.begin) << "_";
results << "end=" << CommonTestUtils::vec2str(params.end) << "_";
results << "stride=" << CommonTestUtils::vec2str(params.strides) << "_";
results << "begin_m=" << CommonTestUtils::vec2str(params.beginMask) << "_";
results << "end_m=" << CommonTestUtils::vec2str(params.endMask) << "_";
results << "new_axis_m=" << (params.newAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.newAxisMask)) << "_";
results << "shrink_m=" << (params.shrinkAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.shrinkAxisMask)) << "_";
results << "ellipsis_m=" << (params.ellipsisAxisMask.empty() ? "def" : CommonTestUtils::vec2str(params.ellipsisAxisMask)) << "_";
results << CPUTestsBase::getTestCaseName(cpuParams);
return result.str();
return results.str();
}
protected:
void SetUp() override {
StridedSliceSpecificParams ssParams;
InferenceEngine::Precision netPrecision;
std::map<std::string, std::string> additionalConfig;
InputShape shapes;
StridedSliceParams ssParams;
ElementType elementType;
CPUSpecificParams cpuParams;
std::tie(ssParams, netPrecision, targetDevice, additionalConfig, cpuParams) = this->GetParam();
inPrc = outPrc = netPrecision;
std::tie(shapes, ssParams, elementType, cpuParams) = this->GetParam();
std::tie(inFmts, outFmts, priority, selectedType) = cpuParams;
configuration.insert(additionalConfig.begin(), additionalConfig.end());
auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(netPrecision);
auto params = ngraph::builder::makeParams(ngPrc, {ssParams.inputShape});
auto paramOuts = ngraph::helpers::convert2OutputVector(
ngraph::helpers::castOps2Nodes<ngraph::op::Parameter>(params));
auto ss = ngraph::builder::makeStridedSlice(paramOuts[0], ssParams.begin, ssParams.end, ssParams.strides, ngPrc, ssParams.beginMask,
selectedType = selectedType + "_" + InferenceEngine::details::convertPrecision(inType).name();
targetDevice = CommonTestUtils::DEVICE_CPU;
init_input_shapes({shapes});
auto params = ngraph::builder::makeDynamicParams(elementType, inputDynamicShapes);
auto ss = ngraph::builder::makeStridedSlice(params[0], ssParams.begin, ssParams.end, ssParams.strides, elementType, ssParams.beginMask,
ssParams.endMask, ssParams.newAxisMask, ssParams.shrinkAxisMask, ssParams.ellipsisAxisMask);
selectedType = std::string("ref_") + inPrc.name();
ss->get_rt_info() = getCPUInfo();
ngraph::ResultVector results{std::make_shared<ngraph::opset1::Result>(ss)};
function = std::make_shared<ngraph::Function>(results, params, "StridedSlice");
}
@ -77,8 +87,9 @@ protected:
TEST_P(StridedSliceLayerCPUTest, CompareWithRefs) {
SKIP_IF_CURRENT_TEST_IS_DISABLED()
Run();
CheckPluginRelatedResults(executableNetwork, "StridedSlice");
run();
// TODO: need to uncomment when this method will be updated
// CheckPluginRelatedResults(executableNetwork, "StridedSlice");
}
namespace {
@ -95,59 +106,74 @@ const auto cpuParams_ndhwc = CPUSpecificParams {{ndhwc}, {ndhwc}, {}, {}};
const auto cpuParams_nchw = CPUSpecificParams {{nchw}, {nchw}, {}, {}};
const auto cpuParams_ncdhw = CPUSpecificParams {{ncdhw}, {ncdhw}, {}, {}};
const std::map<std::string, std::string> additional_config;
const std::vector<InferenceEngine::Precision> inputPrecisions = {
InferenceEngine::Precision::FP32,
InferenceEngine::Precision::BF16,
InferenceEngine::Precision::I8
const std::vector<ElementType> inputPrecisions = {
ElementType::f32,
ElementType::bf16,
ElementType::i8
};
const std::vector<StridedSliceSpecificParams> testCasesPlain2D = {
StridedSliceSpecificParams{ { 32, 32 }, { 0, 20 }, { 32, 30 }, { 1, 1 },
{ 0, 0 }, { 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 32, 20 }, { 2, 10 }, { 32, 20 }, { 1, 1 },
{ 0, 0 }, { 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 32, 20 }, { 2, 10 }, { 32, 20 }, { 1, 2 },
{ 0, 1 }, { 1, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 32, 20 }, { 2, 10 }, { 32, 20 }, { 2, 1 },
{ 0, 0 }, { 1, 0 }, { }, { }, { } },
const std::vector<InputShape> inputShapesDynamic2D = {
{{-1, -1},
{{32, 20}, {16, 16}, {24, 16}}},
{{-1, 16},
{{16, 16}, {20, 16}, {32, 16}}},
{{{16, 32}, {16, 32}},
{{16, 32}, {32, 16}, {24, 24}}},
};
const auto StridedSliceParamsPlain2D = ::testing::Combine(
::testing::ValuesIn(testCasesPlain2D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::Values(emptyCPUSpec));
const std::vector<StridedSliceParams> paramsPlain2D = {
StridedSliceParams{ { 0, 10 }, { 16, 16 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 2, 5 }, { 16, 8 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 2, 5 }, { 16, 16 }, { 1, 2 }, { 0, 1 }, { 1, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0 }, { 16, 16 }, { 2, 1 }, { 0, 0 }, { 1, 0 }, { }, { }, { } },
};
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Plain_2D, StridedSliceLayerCPUTest, StridedSliceParamsPlain2D, StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Plain_Static_2D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation({{32, 20}})),
::testing::ValuesIn(paramsPlain2D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(emptyCPUSpec)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceSpecificParams> testCasesCommon4D = {
StridedSliceSpecificParams{ { 1, 5, 32, 32 }, { 0, 2, 5, 4 }, { 1, 4, 28, 27 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 32, 20 }, { 0, 1, 0, 0 }, { 1, 3, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 32, 20 }, { 0, 0, 10, 0 }, { 1, 3, 20, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 32, 32 }, { 0, 0, 20, 20 }, { 1, 5, 25, 26 }, { 1, 1, 1, 2 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 32, 32 }, { 0, 0, 0, 20 }, { 1, 2, 30, 30 }, { 1, 1, 2, 1 },
{ 0, 0, 0, 1 }, { 0, 1, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 32, 20 }, { 0, 0, 2, 10 }, { 1, 3, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 1, 1 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 32, 32 }, { 0, 1, 0, 10 }, { 1, 5, 32, 30 }, { 1, 1, 1, 1 },
{ 0, 1, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 32, 20 }, { 0, 1, 2, 10 }, { 1, 5, 32, 18 }, { 1, 1, 1, 2 },
{ 0, 0, 1, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 8, 32, 20 }, { 0, 0, 2, 10 }, { 1, 8, 32, 18 }, { 1, 2, 1, 2 },
{ 0, 0, 1, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 8, 32, 20 }, { 0, 0, 10 }, { 0, 32, 18 }, { 1, 1, 1 },
{ 1, 1, 0 }, { 1, 1, 0 }, { }, { }, { 1, 0, 0 } },
StridedSliceSpecificParams{ { 2, 8, 32, 20 }, { 0, 0, 10 }, { 1, 0, 20 }, { 1, 1, 1 },
{ 1, 1, 0 }, { 0, 1, 1 }, { }, { }, { 0, 1, 0 } },
StridedSliceSpecificParams{ { 2, 8, 32, 20 }, { 0, 4, 10 }, { 2, 8, 0 }, { 1, 1, 1 },
{ 1, 0, 1 }, { 1, 1, 1 }, { }, { }, { 0, 0, 1 } }
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Plain_Dynamic_2D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesDynamic2D),
::testing::ValuesIn(paramsPlain2D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(emptyCPUSpec)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceParams> testCasesCommon4D = {
StridedSliceParams{ { 0, 2, 5, 4 }, { 1, 4, 28, 27 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 1, 0, 0 }, { 1, 3, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0 }, { 1, 3, 20, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 20, 20 }, { 1, 5, 25, 26 }, { 1, 1, 1, 2 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 20 }, { 1, 2, 30, 30 }, { 1, 1, 2, 1 }, { 0, 0, 0, 1 }, { 0, 1, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 2, 10 }, { 1, 3, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 1, 1 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 1, 0, 10 }, { 1, 5, 32, 30 }, { 1, 1, 1, 1 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 1, 2, 10 }, { 1, 5, 32, 18 }, { 1, 1, 1, 2 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 2, 10 }, { 1, 8, 32, 18 }, { 1, 2, 1, 2 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10 }, { 0, 32, 18 }, { 1, 1, 1 }, { 1, 1, 0 }, { 1, 1, 0 }, { }, { }, { 1, 0, 0 } },
StridedSliceParams{ { 0, 0, 10 }, { 1, 0, 20 }, { 1, 1, 1 }, { 1, 1, 0 }, { 0, 1, 1 }, { }, { }, { 0, 1, 0 } },
StridedSliceParams{ { 0, 4, 10 }, { 1, 8, 0 }, { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { }, { }, { 0, 0, 1 } }
};
const std::vector<Shape> inputShapesStatic4D = {
{ 1, 5, 32, 32 }, { 2, 5, 32, 48 }
};
const std::vector<InputShape> inputShapesDynamic4D = {
{{-1, -1, -1, -1},
{{ 1, 5, 32, 32 }, { 2, 5, 32, 32 }, { 1, 5, 64, 64 }}},
{{-1, 5, -1, -1},
{{ 1, 5, 32, 32 }, { 2, 5, 32, 32 }, { 3, 5, 32, 36 }}},
{{{1, 5}, 5, {32, 64}, {32, 64}},
{{ 2, 5, 32, 32 }, { 1, 5, 48, 32 }, { 5, 5, 32, 32 }}},
};
const std::vector<CPUSpecificParams> CPUParamsCommon4D = {
@ -155,44 +181,68 @@ const std::vector<CPUSpecificParams> CPUParamsCommon4D = {
cpuParams_nhwc,
};
const auto StridedSliceParamsCommon4D = ::testing::Combine(
::testing::ValuesIn(testCasesCommon4D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::ValuesIn(CPUParamsCommon4D));
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_4D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesStatic4D)),
::testing::ValuesIn(testCasesCommon4D),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsCommon4D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_4D, StridedSliceLayerCPUTest, StridedSliceParamsCommon4D, StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_4D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesDynamic4D),
::testing::ValuesIn(testCasesCommon4D),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsCommon4D)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceSpecificParams> testCasesBlocked4D = {
StridedSliceSpecificParams{ { 1, 16, 32, 32 }, { 0, 0, 5, 4 }, { 1, 16, 28, 27 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 10, 10 }, { 0, 16, 0, 0 }, { 1, 32, 10, 10 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 32, 20 }, { 0, 0, 10, 0 }, { 1, 16, 20, 10 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 32, 32 }, { 0, 0, 20, 20 }, { 1, 32, 25, 25 }, { 1, 1, 1, 1 },
{ 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 48, 32, 32 }, { 0, 16, 0, 20 }, { 1, 32, 32, 30 }, { 1, 1, 1, 2 },
{ 1, 0, 1, 0 }, { 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 32, 20 }, { 0, 16, 2, 10 }, { 1, 32, 32, 20 }, { 1, 1, 2, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 32, 20 }, { 0, 16, 0, 0 }, { 2, 64, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 32, 20 }, { 0, 32, 0, 0 }, { 2, 50, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 32, 20 }, { 0, 0, 0, 0 }, { 2, 12, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 64, 32, 20 }, { 0, -16, 0, 10 }, { 2, 100, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 32, 20 }, { 0, -16, 0, 0 }, { 2, -4, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 32, 20 }, { 0, -32, 0, 0 }, { 2, -12, 32, 20 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 32, 20 }, { 0, 10 }, { 0, 20 }, { 1, 1 },
{ 1, 0 }, { 1, 0 }, { }, { }, { 1, 0 } },
StridedSliceSpecificParams{ { 2, 32, 32, 20 }, { 0, 16, 0 }, { 2, 32, 0 }, { 1, 1, 1 },
{ 1, 0, 1 }, { 1, 1, 1 }, { }, { }, { 0, 0, 1 } },
const std::vector<StridedSliceParams> testCasesBlocked4DSubset1 = {
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 32, 32, 32 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 16, 0 }, { 1, 32, 32, 32 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 32, 32, 16 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 16, 32, 32 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
};
const std::vector<StridedSliceParams> testCasesBlocked4DSubset2 = {
StridedSliceParams{ { 0, 0, 5, 4 }, { 1, 16, 28, 27 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 0, 0 }, { 1, 32, 10, 10 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0 }, { 1, 16, 20, 10 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 20, 20 }, { 1, 32, 25, 25 }, { 1, 1, 1, 1 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 0, 20 }, { 1, 32, 32, 30 }, { 1, 1, 1, 2 }, { 1, 0, 1, 0 }, { 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 2, 10 }, { 1, 32, 32, 20 }, { 1, 1, 2, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 0, 0 }, { 2, 64, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 32, 0, 0 }, { 2, 50, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 2, 12, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, -16, 0, 10 }, { 2, 100, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, -16, 0, 0 }, { 2, -4, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, -32, 0, 0 }, { 2, -12, 32, 20 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 10 }, { 0, 20 }, { 1, 1 }, { 1, 0 }, { 1, 0 }, { }, { }, { 1, 0 } },
StridedSliceParams{ { 0, 16, 0 }, { 2, 32, 0 }, { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { }, { }, { 0, 0, 1 } },
};
const std::vector<Shape> inputShapesBlockedStatic4DSubset1 = {
{ 1, 32, 32, 32 }, { 1, 32, 32, 64 }
};
const std::vector<Shape> inputShapesBlockedStatic4DSubset2 = {
{ 1, 64, 32, 32 }, { 1, 64, 32, 64 }
};
const std::vector<InputShape> inputShapesBlockedDynamic4DSubset1 = {
{{-1, 32, -1, -1},
{{ 1, 32, 32, 32 }, { 2, 32, 32, 32 }, { 3, 32, 32, 48 }}},
{{{1, 5}, 32, {32, 64}, {32, 64}},
{{ 2, 32, 32, 32 }, { 1, 32, 48, 32 }, { 5, 32, 32, 48 }}},
};
const std::vector<InputShape> inputShapesBlockedDynamic4DSubset2 = {
{{-1, 64, -1, -1},
{{ 1, 64, 64, 32 }, { 2, 64, 32, 32 }, { 3, 64, 32, 48 }}},
{{{1, 5}, 64, {32, 64}, {32, 64}},
{{ 2, 64, 32, 32 }, { 1, 64, 48, 32 }, { 1, 64, 64, 64 }}},
};
const std::vector<CPUSpecificParams> CPUParamsBlocked4D = {
@ -200,42 +250,62 @@ const std::vector<CPUSpecificParams> CPUParamsBlocked4D = {
cpuParams_nChw8c,
};
const auto StridedSliceParamsBlocked4D = ::testing::Combine(
::testing::ValuesIn(testCasesBlocked4D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::ValuesIn(CPUParamsBlocked4D));
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_4D_Subset1, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesBlockedStatic4DSubset1)),
::testing::ValuesIn(testCasesBlocked4DSubset1),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked4D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Blocked_4D, StridedSliceLayerCPUTest, StridedSliceParamsBlocked4D, StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_4D_Subset1, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesBlockedDynamic4DSubset1),
::testing::ValuesIn(testCasesBlocked4DSubset1),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked4D)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceSpecificParams> testCasesCommon5D = {
StridedSliceSpecificParams{ { 1, 5, 20, 32, 32 }, { 0, 2, 0, 5, 4 }, { 1, 4, 5, 28, 27 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 20, 32, 20 }, { 0, 0, 10, 0, 0 }, { 1, 5, 20, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 20, 32, 20 }, { 0, 1, 10, 0, 0 }, { 1, 3, 20, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 20, 32, 32 }, { 0, 0, 0, 20, 20 }, { 1, 5, 20, 30, 26 }, { 1, 1, 1, 2, 2 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 20, 32, 32 }, { 0, 0, 10, 0, 20 }, { 1, 2, 20, 30, 30 }, { 1, 1, 2, 1, 1 },
{ 0, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 20, 32, 32 }, { 0, 0, 2, 10, 0 }, { 1, 5, 10, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 5, 20, 32, 32 }, { 0, 1, 0, 10, 0 }, { 1, 5, 20, 32, 32 }, { 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 5, 20, 32, 32 }, { 0, 0, 0, 0, 0 }, { 1, 5, 10, 16, 16 }, { 1, 1, 2, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 8, 20, 32, 32 }, { 0, 2, 0, 0, 0 }, { 1, 8, 10, 16, 16 }, { 1, 2, 1, 1, 2 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 8, 20, 32, 32 }, { 0, 2, 0, 0, 16 }, { 2, 8, 20, 32, 32 }, { 1, 2, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 8, 10, 10, 10 }, { 0, 5 }, { 0, 10 }, { 1, 1 },
{ 1, 0 }, { 1, 0 }, { }, { }, { 1, 0 } },
StridedSliceSpecificParams{ { 2, 8, 10, 10, 10 }, { 0, 0, 5 }, { 0, 0, 10 }, { 1, 1, 1 },
{ 1, 1, 0 }, { 1, 1, 0 }, { }, { }, { 0, 1, 0 } },
StridedSliceSpecificParams{ { 2, 8, 10, 10, 10 }, { 0, 2, 0 }, { 2, 8, 0 }, { 1, 1, 1 },
{ 1, 0, 1 }, { 1, 1, 1 }, { }, { }, { 0, 0, 1 } }
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_4D_Subset2, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesBlockedStatic4DSubset2)),
::testing::ValuesIn(testCasesBlocked4DSubset2),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked4D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_4D_Subset2, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesBlockedDynamic4DSubset2),
::testing::ValuesIn(testCasesBlocked4DSubset2),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked4D)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceParams> testCasesCommon5D = {
StridedSliceParams{ { 0, 2, 0, 5, 4 }, { 1, 4, 5, 28, 27 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 0 }, { 1, 5, 20, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 1, 10, 0, 0 }, { 1, 3, 20, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 20, 20 }, { 1, 5, 20, 30, 26 }, { 1, 1, 1, 2, 2 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 20 }, { 1, 2, 20, 30, 30 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 2, 10, 0 }, { 1, 5, 10, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 1, 0, 10, 0 }, { 1, 5, 20, 32, 32 }, { 1, 1, 1, 1, 1 }, { 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0, 0 }, { 1, 5, 10, 16, 16 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
};
const std::vector<Shape> inputShapesStatic5D = {
{ 1, 5, 20, 32, 32 }, { 2, 5, 32, 32, 32 }
};
const std::vector<InputShape> inputShapesDynamic5D = {
{{-1, -1, -1, -1, -1},
{{ 1, 5, 32, 32, 32 }, { 1, 5, 32, 32, 48 }, { 1, 5, 64, 64, 64 }, { 1, 10, 32, 32, 32 }}},
{{-1, 5, -1, -1, -1},
{{ 1, 5, 32, 32, 48 }, { 1, 5, 32, 48, 32 }, { 1, 5, 48, 32, 32 }}},
{{{1, 5}, 5, {32, 64}, {32, 64}, {32, 64}},
{{ 2, 5, 32, 32, 32 }, { 1, 5, 48, 32, 32 }, { 5, 5, 32, 32, 48 }}},
};
const std::vector<CPUSpecificParams> CPUParamsCommon5D = {
@ -243,46 +313,68 @@ const std::vector<CPUSpecificParams> CPUParamsCommon5D = {
cpuParams_ndhwc,
};
const auto StridedSliceParamsCommon5D = ::testing::Combine(
::testing::ValuesIn(testCasesCommon5D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::ValuesIn(CPUParamsCommon5D));
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_5D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesStatic5D)),
::testing::ValuesIn(testCasesCommon5D),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsCommon5D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_5D, StridedSliceLayerCPUTest, StridedSliceParamsCommon5D, StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_5D, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesDynamic5D),
::testing::ValuesIn(testCasesCommon5D),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsCommon5D)),
StridedSliceLayerCPUTest::getTestCaseName);
const std::vector<StridedSliceSpecificParams> testCasesBlocked5D = {
StridedSliceSpecificParams{ { 1, 16, 20, 32, 32 }, { 0, 0, 0, 5, 4 }, { 1, 16, 5, 28, 27 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 32, 20, 32, 20 }, { 0, 0, 10, 0, 0 }, { 1, 16, 20, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 20, 32, 20 }, { 0, 0, 10, 0, 0 }, { 1, 16, 20, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 16, 20, 32, 32 }, { 0, 0, 0, 20, 20 }, { 1, 16, 20, 30, 26 }, { 1, 1, 1, 2, 2 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 20, 32, 32 }, { 0, 0, 10, 0, 20 }, { 1, 16, 20, 30, 30 }, { 1, 1, 2, 1, 1 },
{ 0, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 16, 20, 32, 32 }, { 0, 0, 2, 10, 0 }, { 1, 16, 10, 32, 20 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 20, 32, 32 }, { 0, 0, 0, 10, 0 }, { 1, 8, 20, 32, 32 }, { 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 16, 20, 32, 32 }, { 0, 0, 0, 0, 0 }, { 1, 16, 10, 16, 16 }, { 1, 1, 2, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 0, 0, 0, 0 }, { 1, 25, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 16, 0, 0, 0 }, { 1, 25, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 16, 0, 0, 0 }, { 1, 64, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 0, 0, 0, 0 }, { 2, 25, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 0, 0, 0, 0 }, { 2, 60, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 32, 0, 0, 0 }, { 2, 40, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 2, 64, 20, 10, 10 }, { 0, 16, 0, 0, 0 }, { 2, 64, 20, 10, 10 }, { 1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } }
const std::vector<StridedSliceParams> testCasesBlocked5DSubset1 = {
StridedSliceParams{ { 0, 0, 0, 5, 4 }, { 1, 16, 5, 28, 27 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 0 }, { 1, 16, 20, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 20, 20 }, { 1, 16, 20, 30, 26 }, { 1, 1, 1, 2, 2 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 20 }, { 1, 16, 20, 30, 30 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 2, 10, 0 }, { 1, 16, 10, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 10, 0 }, { 1, 8, 20, 32, 32 }, { 1, 1, 1, 1, 1 }, { 0, 1, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0, 0 }, { 1, 16, 10, 16, 16 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
};
const std::vector<StridedSliceParams> testCasesBlocked5DSubset2 = {
StridedSliceParams{ { 0, 0, 0, 5, 4 }, { 1, 16, 5, 28, 27 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 0 }, { 1, 16, 20, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 0 }, { 1, 16, 20, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 20, 20 }, { 1, 16, 20, 30, 26 }, { 1, 1, 1, 2, 2 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 10, 0, 20 }, { 1, 16, 20, 30, 30 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 1 }, { 0, 1, 0, 1, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 2, 10, 0 }, { 1, 16, 10, 32, 20 }, { 1, 1, 1, 1, 1 }, { 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 10, 0 }, { 1, 8, 20, 32, 32 }, { 1, 1, 1, 1, 1 }, { 0, 1, 0, 0, 0 }, { 0, 1, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0, 0 }, { 1, 16, 10, 16, 16 }, { 1, 1, 2, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0, 0 }, { 1, 25, 20, 10, 10 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 0, 0, 0 }, { 1, 25, 20, 10, 10 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 16, 0, 0, 0 }, { 1, 64, 20, 10, 10 }, { 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { }, { }, { } },
};
const std::vector<Shape> inputShapesBlockedStatic5DSubset1 = {
{ 1, 16, 32, 32, 32 }, { 2, 16, 32, 32, 32 }, { 2, 32, 32, 32, 32 }
};
const std::vector<Shape> inputShapesBlockedStatic5DSubset2 = {
{ 1, 64, 32, 32, 32 }, { 2, 64, 32, 64, 32 }, { 2, 64, 32, 32, 32 }
};
const std::vector<InputShape> inputShapesBlockedDynamic5DSubset1 = {
{{-1, 16, -1, -1, -1},
{{ 1, 16, 32, 32, 32 }, { 2, 16, 32, 32, 32 }, { 2, 16, 32, 32, 32 }}},
{{{1, 5}, 16, {16, 32}, {16, 32}, {16, 32}},
{{ 1, 16, 32, 32, 32 }, { 2, 16, 32, 32, 32 }, { 1, 16, 20, 32, 32 }}},
};
const std::vector<InputShape> inputShapesBlockedDynamic5DSubset2 = {
{{-1, 64, -1, -1, -1},
{{ 1, 64, 64, 32, 32 }, { 2, 64, 32, 32, 32 }, { 3, 64, 32, 48, 32 }}},
{{{1, 5}, 64, {16, 32}, {16, 32}, {16, 32}},
{{ 1, 64, 32, 32, 32 }, { 2, 64, 32, 32, 32 }, { 1, 64, 20, 32, 32 }}},
};
const std::vector<CPUSpecificParams> CPUParamsBlocked5D = {
@ -290,50 +382,69 @@ const std::vector<CPUSpecificParams> CPUParamsBlocked5D = {
cpuParams_nCdhw8c,
};
const auto StridedSliceParamsBlocked5D = ::testing::Combine(
::testing::ValuesIn(testCasesBlocked5D),
::testing::ValuesIn(inputPrecisions),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::ValuesIn(CPUParamsBlocked5D));
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_5D_Subset1, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesBlockedStatic5DSubset1)),
::testing::ValuesIn(testCasesBlocked5DSubset1),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked5D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Blocked_5D, StridedSliceLayerCPUTest, StridedSliceParamsBlocked5D, StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_5D_Subset1, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesBlockedDynamic5DSubset1),
::testing::ValuesIn(testCasesBlocked5DSubset1),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked5D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Static_5D_Subset2, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(static_shapes_to_test_representation(inputShapesBlockedStatic4DSubset2)),
::testing::ValuesIn(testCasesBlocked4DSubset2),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked4D)),
StridedSliceLayerCPUTest::getTestCaseName);
INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_Common_Dynamic_5D_Subset2, StridedSliceLayerCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesBlockedDynamic5DSubset2),
::testing::ValuesIn(testCasesBlocked5DSubset2),
::testing::ValuesIn(inputPrecisions),
::testing::ValuesIn(CPUParamsBlocked5D)),
StridedSliceLayerCPUTest::getTestCaseName);
/* Descriptors check */
class StridedSliceLayerDescriptorCPUTest : public StridedSliceLayerCPUTest {};
const std::vector<StridedSliceSpecificParams> testCasesPlanar4D = {
StridedSliceSpecificParams{ {1, 32, 112, 112 }, { 0, -28, 0, 0 }, { 0, 2147483647, 0, 0 }, { 1, 1, 1, 1 }, { 1, 0, 1, 1 },
{ 1, 0, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } },
StridedSliceSpecificParams{ { 1, 17, 32, 20 }, { 0, 0, 10, 0 }, { 1, 17, 20, 10 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 1 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 32, 32 }, { 0, 5, 0, 0 }, { 1, 20, 28, 27 }, { 1, 1, 1, 1 },
{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceSpecificParams{ { 1, 16, 100, 1, 1 }, { 0, -1, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 },
{ 1, 0, 1, 0 }, { 1, 0, 1, 0 }, { }, { 0, 1, 0, 1 }, {} },
StridedSliceSpecificParams{ { 2, 3, 4, 5 }, { 0, 0, 0, 0, 0 }, { 0, 2, 3, 4, 5 }, { 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1 }, { 0, 0, 1, 0, 0 }, {}, {} },
};
const auto StridedSliceParamsDescriptorsCheck4D = ::testing::Combine(
::testing::ValuesIn(testCasesPlanar4D),
::testing::Values(InferenceEngine::Precision::FP32),
::testing::Values(CommonTestUtils::DEVICE_CPU),
::testing::Values(additional_config),
::testing::Values(cpuParams_nChw8c));
TEST_P(StridedSliceLayerDescriptorCPUTest, DescriptorsCheck) {
SKIP_IF_CURRENT_TEST_IS_DISABLED()
ASSERT_THROW(LoadNetwork(), InferenceEngine::Exception);
ASSERT_THROW(compile_model(), ov::Exception);
}
INSTANTIATE_TEST_SUITE_P(smoke_StridedSliceLayerDescriptorCPUTest,
StridedSliceLayerDescriptorCPUTest,
StridedSliceParamsDescriptorsCheck4D,
const std::vector<StridedSliceParams> testCasesDescriptors = {
StridedSliceParams{ { 0, -4, 0, 0 }, { 0, 2147483647, 0, 0 }, { 1, 1, 1, 1 }, { 1, 0, 1, 1 }, { 1, 0, 1, 1 }, { }, { }, { } },
StridedSliceParams{ { 0, 5, 0, 0 }, { 1, 20, 28, 27 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 2147483647, 32, 32 }, { 1, 2, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, { }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 2147483647, 32, 32 }, { 1, 2, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { }, {0, 1, 0, 0 }, { } },
StridedSliceParams{ { 0, 0, 0, 0 }, { 1, 2147483647, 32, 32 }, { 1, 2, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, {0, 0, 1, 0 }, { }, { } },
};
const std::vector<InputShape> inputShapesDescriptors = {
{{}, {{ 1, 16, 32, 32 }}},
{{}, {{ 1, 17, 32, 32 }}},
{{1, -1, 32, 32}, {{ 1, 16, 32, 32 }, { 1, 32, 32, 32 }}}
};
INSTANTIATE_TEST_SUITE_P(smoke_StridedSliceLayerDescriptorCPUTest, StridedSliceLayerDescriptorCPUTest,
::testing::Combine(
::testing::ValuesIn(inputShapesDescriptors),
::testing::ValuesIn(testCasesDescriptors),
::testing::Values(ElementType::f32),
::testing::Values(cpuParams_nChw8c)),
StridedSliceLayerDescriptorCPUTest::getTestCaseName);
} // namespace
} // namespace CPULayerTestsDefinitions