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/pim.cpp | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/intersim/pim.cpp (limited to 'src/intersim/pim.cpp') diff --git a/src/intersim/pim.cpp b/src/intersim/pim.cpp new file mode 100644 index 0000000..be5872c --- /dev/null +++ b/src/intersim/pim.cpp @@ -0,0 +1,98 @@ +#include "booksim.hpp" +#include + +#include "pim.hpp" +#include "random_utils.hpp" + +//#define DEBUG_PIM + +PIM::PIM( const Configuration &config, + Module *parent, const string& name, + int inputs, int outputs ) : +DenseAllocator( config, parent, name, inputs, outputs ) +{ + _PIM_iter = config.GetInt( "alloc_iters" ); + + _grants = new int [_outputs]; +} + +PIM::~PIM( ) +{ + delete [] _grants; +} + +void PIM::Allocate( ) +{ + int input; + int output; + + int input_offset; + int output_offset; + + _ClearMatching( ); + + for ( int iter = 0; iter < _PIM_iter; ++iter ) { + // Grant phase --- outputs randomly choose + // between one of their requests + + for ( output = 0; output < _outputs; ++output ) { + _grants[output] = -1; + + // A random arbiter between input requests + input_offset = RandomInt( _inputs - 1 ); + + for ( int i = 0; i < _inputs; ++i ) { + input = ( i + input_offset ) % _inputs; + + if ( ( _request[input][output].label != -1 ) && + ( _inmatch[input] == -1 ) && + ( _outmatch[output] == -1 ) ) { + + // Grant + _grants[output] = input; + break; + } + } + } + + // Accept phase -- inputs randomly choose + // between input_speedup of their grants + + for ( input = 0; input < _inputs; ++input ) { + + // A random arbiter between output grants + output_offset = RandomInt( _outputs - 1 ); + + for ( int o = 0; o < _outputs; ++o ) { + output = ( o + output_offset ) % _outputs; + + if ( _grants[output] == input ) { + + // Accept + _inmatch[input] = output; + _outmatch[output] = input; + + break; + } + } + } + } + +#ifdef DEBUG_PIM + if ( _outputs == 8 ) { + cout << "input match: " << endl; + for ( int i = 0; i < _inputs; ++i ) { + cout << " from " << i << " to " << _inmatch[i] << endl; + } + cout << endl; + } + + cout << "output match: "; + for ( int j = 0; j < _outputs; ++j ) { + cout << _outmatch[j] << " "; + } + cout << endl; +#endif +} + + -- cgit v1.3