MCPcopy Create free account
hub / github.com/alibaba/MNN / _createSubModuleInfo

Function _createSubModuleInfo

tools/cpp/compilefornpu.cpp:643–762  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

641}
642
643static std::vector<SubModuleInfo> _createSubModuleInfo(const Net* net, const std::set<int>& inputIndexes, const std::set<int>& outputIndexes, const std::set<int>& noComputeIndexes, std::shared_ptr<Schedule::ScheduleInfo> sharedConst) {
644 std::vector<SubModuleInfo> submodule;
645 auto selectOps = _collectNeededOps(net, inputIndexes, outputIndexes);
646
647 // Separate the graph to serveral submodule
648 SubModuleInfo current;
649 for (int si=0; si<selectOps.size(); ++si) {
650 auto i = selectOps[si];
651 auto op = net->oplists()->GetAs<Op>(i);
652 if (isBreakOp(op) || gExtraBreakOpIndexes.count(i) > 0) {
653 // TODO: Don't need split segment
654 if (current.opList.size() > 0) {
655 // Not empty
656 submodule.emplace_back(std::move(current));
657 }
658 SubModuleInfo controlOp;
659 controlOp.opList = {i};
660 controlOp.isBreak = true;
661 if (nullptr != op->inputIndexes()) {
662 controlOp.inputs.resize(op->inputIndexes()->size());
663 ::memcpy(controlOp.inputs.data(), op->inputIndexes()->data(), controlOp.inputs.size() * sizeof(int));
664 }
665 if (nullptr != op->outputIndexes()) {
666 controlOp.outputs.resize(op->outputIndexes()->size());
667 ::memcpy(controlOp.outputs.data(), op->outputIndexes()->data(), controlOp.outputs.size() * sizeof(int));
668 }
669 submodule.emplace_back(std::move(controlOp));
670 continue;
671 }
672 current.opList.emplace_back(i);
673 }
674 if (!current.opList.empty()) {
675 submodule.emplace_back(std::move(current));
676 }
677 submodule = _splitSubModuleForShapeConst(submodule, net, sharedConst);
678 for (int moduleIndex=0; moduleIndex < submodule.size(); ++moduleIndex) {
679 auto& m = submodule[moduleIndex];
680 // Compute input / output
681 if (!m.isBreak) {
682 _computeTensorMask(m, net);
683 for (int i=0; i<m.tensorMask.size(); ++i) {
684 if (0 == m.tensorMask[i]) {
685 continue;
686 }
687 if (1 == m.tensorMask[i]) {
688 if (noComputeIndexes.find(i) != noComputeIndexes.end()) {
689 continue;
690 }
691 m.inputs.emplace_back(i);
692 continue;
693 }
694 if (2 == m.tensorMask[i]) {
695 m.outputs.emplace_back(i);
696 continue;
697 }
698 if (3 == m.tensorMask[i]) {
699 if (outputIndexes.find(i) != outputIndexes.end()) {
700 m.outputs.emplace_back(i);

Callers 1

mainFunction · 0.70

Calls 15

GetAsStringMethod · 0.80
_collectNeededOpsFunction · 0.70
isBreakOpFunction · 0.70
_computeTensorMaskFunction · 0.70
sortFunction · 0.50
sizeMethod · 0.45
countMethod · 0.45
resizeMethod · 0.45
dataMethod · 0.45
emptyMethod · 0.45
findMethod · 0.45

Tested by

no test coverage detected