/** * Copyright 2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GE_GRAPH_BUILD_STREAM_ALLOCATOR_H_ #define GE_GRAPH_BUILD_STREAM_ALLOCATOR_H_ #include #include #include #include #include #include "engine_manager/dnnengine_manager.h" #include "framework/common/ge_inner_error_codes.h" #include "graph/compute_graph.h" #include "graph/manager/graph_manager_utils.h" namespace ge { class StreamAllocator { public: StreamAllocator(ComputeGraphPtr whole_graph, const Graph2SubGraphInfoList &subgraphs); StreamAllocator(const StreamAllocator &) = delete; StreamAllocator &operator=(const StreamAllocator &) = delete; ~StreamAllocator() = default; Status AssignLogicalStreams(const std::map &max_parallel_num, bool hcom_parallel); Status RefreshRealStream(int64_t &stream_num, int64_t &event_num); const vector &GetHugeStreams() const { return huge_streams_; } private: Status AssignSingleStream(); Status SetActiveStreamsByLabel(); Status SetActiveStreamsForSubgraphs(); Status InsertSyncEvents(); Status InsertOneEventInTwoNodes(const NodePtr &cur_node_ptr, const NodePtr &next_node_ptr); Status InsertEventsForSubgraph(); Status OptimizeSyncEvents(); Status OptimizeBySendEvents(const std::map> &stream_nodes); Status OptimizeByRecvEvents(const std::map> &stream_nodes); Status OptimizeByStreamActivate(); // Determine if the successor node of RecvNode is directly or indirectly activated by the SendNode precursor node bool IsRecvNodeActivatedBySendNode(const NodePtr &send_node_ptr, const NodePtr &recv_node_ptr) const; bool IsActiveAfterNextIteration(const NodePtr &active_node_ptr) const; Status SplitStreams(std::vector> &split_streams); bool NeedSpiltNewStream(int64_t stream_node_num, int64_t max_node_num_one_stream, const OpDescPtr &op_desc, bool is_stream_first_node) const; Status UpdateActiveStreams(const std::vector> &split_streams); void UpdateLabelStreams(const std::vector> &split_streams); Status UpdateActiveStreamsForSwitchNode(NodePtr &switch_node); Status InsertActiveNodesAfterSwitch(NodePtr &switch_nodes, std::vector &switch_active_nodes); Status UpdateActiveStreamsForActiveNode(const std::vector> &split_streams, NodePtr &node); Status UpdateActiveStreamsForSubgraphs() const; bool IsActivated(int64_t stream_id) const; Status SetActiveStreamsForLoop(); Status CheckStreamActived() const; Status RefreshContinuousEvents(); Status InsertSyncEventNodes(); void DumpEvents(); Status GetMaxStreamAndTask(bool huge_stream, uint32_t &max_stream_count, uint32_t &max_task_count); int64_t GetMaxNodeNumPerStream(const NodePtr &node, uint32_t max_node_num_one_stream); void AddNodeNum(const NodePtr &node, int64_t &node_num); void AddSendEventId(const NodePtr &node, uint32_t event_id); void AddRecvEventId(const NodePtr &node, uint32_t event_id); void RmvSendEventId(const NodePtr &node, uint32_t event_id); void RmvRecvEventId(const NodePtr &node, uint32_t event_id); void GetSendEventIdList(const NodePtr &node, std::vector &send_list) const; void GetRecvEventIdList(const NodePtr &node, std::vector &recv_list) const; NodePtr GetNodeFromSendEventId(uint32_t send_event_id) const; NodePtr GetNodeFromRecvEventId(uint32_t recv_event_id) const; Status AddEventId(const NodePtr &pre_node, const NodePtr ¬_cur, const NodePtr &cur_node, bool not_use_cur); Status AddActiveNodes(NodePtr &switch_node, const std::vector &ori_active_label_list, std::vector &active_label_list, std::vector &added_active_nodes); Status SetActiveStreamList(NodePtr &active_node, const std::string &active_label); ComputeGraphPtr whole_graph_; const Graph2SubGraphInfoList &subgraphs_; int64_t stream_num_{0}; uint32_t event_num_{0}; bool enable_single_stream_{false}; vector huge_streams_; // > std::map> labeled_streams_; std::map> specific_activated_labels_; std::set specific_activated_streams_; std::map> specific_activated_streams_nodes_map_; std::map node_split_stream_map_; std::map subgraph_first_active_node_map_; // send events corresponding to the node std::map> node_to_send_events_; // recv events corresponding to the node std::map> node_to_recv_events_; }; } // namespace ge #endif // GE_GRAPH_BUILD_STREAM_ALLOCATOR_H_