src/Sim/ExecUnit/ExecUnitReserver.cpp

説明を見る。
00001 // 
00002 // Copyright (c) 2005-2008 Kenichi Watanabe.
00003 // Copyright (c) 2005-2008 Yasuhiro Watari.
00004 // Copyright (c) 2005-2008 Hironori Ichibayashi.
00005 // Copyright (c) 2008-2009 Kazuo Horio.
00006 // Copyright (c) 2009-2013 Naruki Kurata.
00007 // Copyright (c) 2005-2013 Ryota Shioya.
00008 // Copyright (c) 2005-2013 Masahiro Goshima.
00009 // 
00010 // This software is provided 'as-is', without any express or implied
00011 // warranty. In no event will the authors be held liable for any damages
00012 // arising from the use of this software.
00013 // 
00014 // Permission is granted to anyone to use this software for any purpose,
00015 // including commercial applications, and to alter it and redistribute it
00016 // freely, subject to the following restrictions:
00017 // 
00018 // 1. The origin of this software must not be misrepresented; you must not
00019 // claim that you wrote the original software. If you use this software
00020 // in a product, an acknowledgment in the product documentation would be
00021 // appreciated but is not required.
00022 // 
00023 // 2. Altered source versions must be plainly marked as such, and must not be
00024 // misrepresented as being the original software.
00025 // 
00026 // 3. This notice may not be removed or altered from any source
00027 // distribution.
00028 // 
00029 // 
00030 
00031 
00032 #include <pch.h>
00033 
00034 #include "Sim/ExecUnit/ExecUnitReserver.h"
00035 
00036 using namespace std;
00037 using namespace Onikiri;
00038 
00039 ExecUnitReserver::ExecUnitReserver() : 
00040     m_unitCount( 0 ),
00041     m_current( 0 )
00042 {
00043 
00044 }
00045 
00046 ExecUnitReserver::~ExecUnitReserver()
00047 {
00048 
00049 }
00050 
00051 void ExecUnitReserver::Initialize( int unitCount, int wheelSize )
00052 {
00053     m_unitCount = unitCount;
00054     m_wheel.resize( wheelSize, 0 );
00055 }
00056 
00057 int ExecUnitReserver::GetWheelIndex( int delta )
00058 {
00059     int index = (int)m_current + delta;
00060     int size = (int)m_wheel.size();
00061     if( index >= size ){
00062         index -= size;
00063     }
00064     return index;
00065 }
00066 
00067 void ExecUnitReserver::Begin()
00068 {
00069     m_resvQueue.clear();
00070 }
00071 
00072 bool ExecUnitReserver::CanReserve( int n, int time, int period )
00073 {
00074     for( int p = 0; p < period; ++p ){
00075         int now = time + p;
00076         int index = GetWheelIndex( now );
00077         int count = m_wheel[ index ];
00078 
00079         for( ReservationQueue::iterator i = m_resvQueue.begin(); i != m_resvQueue.end(); ++i ){
00080             int begin = i->time;
00081             int end   = begin + i->period;
00082             if( begin <= now && now < end ){
00083                 count += i->count;
00084             }
00085         }
00086 
00087         if( count + n > m_unitCount ){
00088             return false;
00089         }
00090     }
00091     return true;
00092 }
00093 
00094 void ExecUnitReserver::Reserve( int n, int time, int period )
00095 {
00096     Reservation res;
00097     res.count = n;
00098     res.time = time;
00099     res.period = period;
00100     m_resvQueue.push_back( res );
00101 }
00102 
00103 void ExecUnitReserver::Update()
00104 {
00105     // Update the reservation wheel based on the reservation queue.
00106     for( ReservationQueue::iterator i = m_resvQueue.begin(); i != m_resvQueue.end(); ++i ){
00107         for( int cycle = 0; cycle < i->period; ++cycle ){
00108             int index = GetWheelIndex( i->time + cycle );
00109             m_wheel[ index ] += i->count;
00110             ASSERT( 
00111                 m_wheel[ index ] <= m_unitCount, 
00112                 "Execution units are reserved exceed a limit." 
00113             );
00114         }
00115     }
00116 
00117     // Reset a count of this cycle.
00118     m_wheel[ GetWheelIndex(0) ] = 0;
00119 
00120     m_current = GetWheelIndex(1);   // Get an index for a next cycle.
00121 }

Onikiri2に対してTue Jun 18 14:34:22 2013に生成されました。  doxygen 1.4.7