// $Id: trafficmanager.hpp 5365 2012-11-25 02:09:59Z qtedq $ /* Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _TRAFFICMANAGER_HPP_ #define _TRAFFICMANAGER_HPP_ #include #include #include #include #include "module.hpp" #include "config_utils.hpp" #include "network.hpp" #include "flit.hpp" #include "buffer_state.hpp" #include "stats.hpp" #include "traffic.hpp" #include "routefunc.hpp" #include "outputset.hpp" #include "injection.hpp" //register the requests to a node class PacketReplyInfo; class TrafficManager : public Module { private: vector > _packet_size; vector > _packet_size_rate; vector _packet_size_max_val; protected: int _nodes; int _routers; int _vcs; vector _net; vector > _router; // ============ Traffic ============ int _classes; vector _load; vector _use_read_write; vector _write_fraction; vector _read_request_size; vector _read_reply_size; vector _write_request_size; vector _write_reply_size; vector _traffic; vector _class_priority; vector > _last_class; vector _traffic_pattern; vector _injection_process; // ============ Message priorities ============ enum ePriority { class_based, age_based, network_age_based, local_age_based, queue_length_based, hop_count_based, sequence_based, none }; ePriority _pri_type; // ============ Injection VC states ============ vector > _buf_states; #ifdef TRACK_FLOWS vector > > _outstanding_credits; vector > > > _outstanding_classes; #endif vector > > _last_vc; // ============ Routing ============ tRoutingFunction _rf; bool _lookahead_routing; bool _noq; // ============ Injection queues ============ vector > _qtime; vector > _qdrained; vector > > _partial_packets; vector > _total_in_flight_flits; vector > _measured_in_flight_flits; vector > _retired_packets; bool _empty_network; bool _hold_switch_for_packet; // ============ physical sub-networks ========== int _subnets; vector _subnet; // ============ deadlock ========== int _deadlock_timer; int _deadlock_warn_timeout; // ============ request & replies ========================== vector _packet_seq_no; vector > _repliesPending; vector _requestsOutstanding; // ============ Statistics ============ vector _plat_stats; vector _overall_min_plat; vector _overall_avg_plat; vector _overall_max_plat; vector _nlat_stats; vector _overall_min_nlat; vector _overall_avg_nlat; vector _overall_max_nlat; vector _flat_stats; vector _overall_min_flat; vector _overall_avg_flat; vector _overall_max_flat; vector _frag_stats; vector _overall_min_frag; vector _overall_avg_frag; vector _overall_max_frag; vector > _pair_plat; vector > _pair_nlat; vector > _pair_flat; vector _hop_stats; vector _overall_hop_stats; vector > _sent_packets; vector _overall_min_sent_packets; vector _overall_avg_sent_packets; vector _overall_max_sent_packets; vector > _accepted_packets; vector _overall_min_accepted_packets; vector _overall_avg_accepted_packets; vector _overall_max_accepted_packets; vector > _sent_flits; vector _overall_min_sent; vector _overall_avg_sent; vector _overall_max_sent; vector > _accepted_flits; vector _overall_min_accepted; vector _overall_avg_accepted; vector _overall_max_accepted; #ifdef TRACK_STALLS vector > _buffer_busy_stalls; vector > _buffer_conflict_stalls; vector > _buffer_full_stalls; vector > _buffer_reserved_stalls; vector > _crossbar_conflict_stalls; vector _overall_buffer_busy_stalls; vector _overall_buffer_conflict_stalls; vector _overall_buffer_full_stalls; vector _overall_buffer_reserved_stalls; vector _overall_crossbar_conflict_stalls; #endif vector _slowest_packet; vector _slowest_flit; map _stats; // ============ Simulation parameters ============ enum eSimState { warming_up, running, draining, done }; eSimState _sim_state; bool _measure_latency; int _reset_time; int _drain_time; int _total_sims; int _sample_period; int _max_samples; int _warmup_periods; int _include_queuing; vector _measure_stats; bool _pair_stats; vector _latency_thres; vector _stopping_threshold; vector _acc_stopping_threshold; vector _warmup_threshold; vector _acc_warmup_threshold; unsigned long long _cur_id; unsigned long long _cur_pid; int _time; set _flits_to_watch; set _packets_to_watch; bool _print_csv_results; //flits to watch ostream * _stats_out; #ifdef TRACK_FLOWS vector > _injected_flits; vector > _ejected_flits; ostream * _injected_flits_out; ostream * _received_flits_out; ostream * _stored_flits_out; ostream * _sent_flits_out; ostream * _outstanding_credits_out; ostream * _ejected_flits_out; ostream * _active_packets_out; #endif #ifdef TRACK_CREDITS ostream * _used_credits_out; ostream * _free_credits_out; ostream * _max_credits_out; #endif // ============ Internal methods ============ protected: virtual void _RetireFlit( Flit *f, int dest ); void _Inject(); virtual void _Step( ); bool _PacketsOutstanding( ) const; virtual int _IssuePacket( int source, int cl ); virtual void _GeneratePacket( int source, int size, int cl, int time ); virtual void _ClearStats( ); void _ComputeStats( const vector & stats, int *sum, int *min = NULL, int *max = NULL, int *min_pos = NULL, int *max_pos = NULL ) const; virtual bool _SingleSim( ); void _DisplayRemaining( ostream & os = cout ) const; void _LoadWatchList(const string & filename); virtual void _UpdateOverallStats(); virtual string _OverallStatsCSV(int c = 0) const; int _GetNextPacketSize(int cl) const; double _GetAveragePacketSize(int cl) const; public: static TrafficManager * New(Configuration const & config, vector const & net); TrafficManager( const Configuration &config, const vector & net ); virtual ~TrafficManager( ); bool Run( ); virtual void WriteStats( ostream & os = cout ) const ; virtual void UpdateStats( ) ; virtual void DisplayStats( ostream & os = cout ) const ; virtual void DisplayOverallStats( ostream & os = cout ) const ; virtual void DisplayOverallStatsCSV( ostream & os = cout ) const ; inline int getTime() { return _time;} Stats * getStats(const string & name) { return _stats[name]; } }; template ostream & operator<<(ostream & os, const vector & v) { for(size_t i = 0; i < v.size() - 1; ++i) { os << v[i] << ","; } os << v[v.size()-1]; return os; } #endif