void RandomPermutationTrafficPattern::randomize(int seed) { unsigned long prev_seed = RandomIntLong( ); RandomSeed(seed); _dest.assign(_nodes, -1); for(int i = 0; i < _nodes; ++i) { int ind = RandomInt(_nodes - 1 - i); int j = 0; int cnt = 0; while((cnt < ind) || (_dest[j] != -1)) { if(_dest[j] == -1) { ++cnt; } ++j; assert(j < _nodes); } _dest[j] = i; } RandomSeed(prev_seed); }
/*legacy, not sure how this fits into the own scheme of things*/ void KNCube::InsertRandomFaults( const Configuration &config ) { int num_fails; unsigned long prev_seed; int node, chan; int i, j, t, n, c; bool *fail_nodes; bool available; bool edge; num_fails = config.GetInt( "link_failures" ); if ( num_fails ) { prev_seed = RandomIntLong( ); RandomSeed( config.GetInt( "fail_seed" ) ); fail_nodes = new bool [_size]; for ( i = 0; i < _size; ++i ) { node = i; // edge test edge = false; for ( n = 0; n < _n; ++n ) { if ( ( ( node % _k ) == 0 ) || ( ( node % _k ) == _k - 1 ) ) { edge = true; } node /= _k; } if ( edge ) { fail_nodes[i] = true; } else { fail_nodes[i] = false; } } for ( i = 0; i < num_fails; ++i ) { j = RandomInt( _size - 1 ); available = false; for ( t = 0; ( t < _size ) && (!available); ++t ) { node = ( j + t ) % _size; if ( !fail_nodes[node] ) { // check neighbors c = RandomInt( 2*_n - 1 ); for ( n = 0; ( n < 2*_n ) && (!available); ++n ) { chan = ( n + c ) % 2*_n; if ( chan % 1 ) { available = fail_nodes[_LeftNode( node, chan/2 )]; } else { available = fail_nodes[_RightNode( node, chan/2 )]; } } } if ( !available ) { cout << "skipping " << node << endl; } } if ( t == _size ) { Error( "Could not find another possible fault channel" ); } OutChannelFault( node, chan ); fail_nodes[node] = true; for ( n = 0; ( n < _n ) && available ; ++n ) { fail_nodes[_LeftNode( node, n )] = true; fail_nodes[_RightNode( node, n )] = true; } cout << "failure at node " << node << ", channel " << chan << endl; } delete [] fail_nodes; RandomSeed( prev_seed ); } }
void RandomPermutationTrafficPattern::randomize(int seed) { unsigned long prev_seed = RandomIntLong( ); RandomSeed(seed); _dest.assign(_nodes, -1); // 8x8 mesh LR int d[16] = {0,1,2,3,4,5,6,7,56,57,58,59,60,61,62,63}; // 8x8 mesh dist //int d[16] = {1,3,4,6,15,31,39,55,62,60,59,57,48,32,24,8}; // 8x8 diamond //int d[16] = {3,4,13,22,31,39,46,53,60,59,50,41,32,24,17,10}; // 4x4 dense //int d[16] = {18,19,20,21,26,27,28,29,34,35,36,37,42,43,44,45}; int dest_taken[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; cout << "Begin Route Table" << endl; for(int i = 0; i < _nodes; ++i) { /* if (i == 18 || i == 19 || i == 20 || i == 21 || i == 26 || i == 27 || i == 28 || i == 29 || i == 34 || i == 35 || i == 36 || i == 37 || i == 42 || i == 43 || i == 44 || i == 45) */ /* if (i == 3 || i == 4 || i == 13 || i == 22 || i == 31 || i == 39 || i == 46 || i == 53 || i == 60 || i == 59 || i == 50 || i == 41 || i == 32 || i == 24 || i == 17 || i == 10) */ if (i <= 7 || i>=56) /* if (i == 1 || i == 3 || i == 4 || i == 6 || i == 15 || i == 31 || i == 39 || i == 55 || i == 62 || i == 60 || i == 59 || i == 57 || i == 48 || i == 32 || i == 24 || i == 8) */ { int dt = -1; int r; while (dt == -1) { r = RandomInt(15); if (dest_taken[r] == 0) { dt = d[r]; dest_taken[r] = 1; } } _dest[i] = dt; cout << i << "\t" << _dest[i] << endl; } } cout << "End Route Table" << endl; /* _dest.assign(_nodes, -1); for(int i = 0; i < _nodes; ++i) { int ind = RandomInt(_nodes - 1 - i); int j = 0; int cnt = 0; while((cnt < ind) || (_dest[j] != -1)) { if(_dest[j] == -1) { ++cnt; } ++j; assert(j < _nodes); } } */ RandomSeed(prev_seed); }