From 69f2911e04ffb1b19eef1fafb8c040af271f656e Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Thu, 15 Jul 2010 18:09:46 -0800 Subject: creating branch for adding support for CUDA 3.x and Fermi [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829] --- src/intersim/loa.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/intersim/loa.cpp (limited to 'src/intersim/loa.cpp') diff --git a/src/intersim/loa.cpp b/src/intersim/loa.cpp new file mode 100644 index 0000000..c7501f3 --- /dev/null +++ b/src/intersim/loa.cpp @@ -0,0 +1,102 @@ +#include "booksim.hpp" +#include + +#include "loa.hpp" +#include "random_utils.hpp" + +LOA::LOA( const Configuration &config, + Module *parent, const string& name, + int inputs, int input_speedup, + int outputs, int output_speedup ) : +DenseAllocator( config, parent, name, inputs, outputs ) +{ + _req = new int [_inputs]; + _counts = new int [_outputs]; + + _rptr = new int [_inputs]; + _gptr = new int [_outputs]; +} + +LOA::~LOA( ) +{ + delete [] _req; + delete [] _counts; + delete [] _rptr; + delete [] _gptr; +} + +void LOA::Allocate( ) +{ + int input; + int output; + + int input_offset; + int output_offset; + + int lonely; + int lonely_cnt; + + // Clear matching + + // Count phase --- the number of requests + // per output is counted + + for ( int i = 0; i < _inputs; ++i ) { + _inmatch[i] = -1; + } + for ( int j = 0; j < _outputs; ++j ) { + _outmatch[j] = -1; + _counts[j] = 0; + + for ( int i = 0; i < _inputs; ++i ) { + _counts[j] += ( _request[i][j].label != -1 ) ? 1 : 0; + } + } + + // Request phase + for ( input = 0; input < _inputs; ++input ) { + + // Find the lonely output + output_offset = _rptr[input]; + lonely = -1; + lonely_cnt = _inputs + 1; + + for ( int o = 0; o < _outputs; ++o ) { + output = ( o + output_offset ) % _outputs; + + if ( ( _request[input][output].label != -1 ) && + ( _counts[output] < lonely_cnt ) ) { + lonely = output; + lonely_cnt = _counts[output]; + } + } + + // Request the lonely output (-1 for no request) + _req[input] = lonely; + } + + // Grant phase + for ( output = 0; output < _outputs; ++output ) { + input_offset = _gptr[output]; + + for ( int i = 0; i < _inputs; ++i ) { + input = ( i + input_offset ) % _inputs; + + if ( _req[input] == output ) { + // Grant! + + _inmatch[input] = output; + _outmatch[output] = input; + + _rptr[input] = ( _rptr[input] + 1 ) % _outputs; + _gptr[output] = ( _gptr[output] + 1 ) % _inputs; + + break; + } + } + } + + +} + + -- cgit v1.3