| 641 | } |
| 642 | |
| 643 | static 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); |
no test coverage detected