00001 #include "DistributedSpikeScheduler.h" 00002 00003 #include <iostream> 00004 00005 using std::cout; 00006 using std::endl; 00007 using std::cerr; 00008 00009 DistributedSpikeScheduler::DistributedSpikeScheduler(SpikeScheduler &localScheduler, 00010 TargetNodesMap & targetNodesMap, 00011 MPIOutputBufferVector &mpiOutputBuffers, 00012 int numLocalEngines) : 00013 _localScheduler(localScheduler), _mpiOutputBuffers(mpiOutputBuffers), 00014 nodesMap(targetNodesMap), nLocalEngines(numLocalEngines) 00015 { 00016 engineClocks.resize(nLocalEngines, int(0)); 00017 } 00018 00019 DistributedSpikeScheduler::~DistributedSpikeScheduler() 00020 {} 00021 00022 void DistributedSpikeScheduler::scheduleSpike(local_objectid_t senderid, float offsetFraction, engineid_t engine) 00023 { 00024 00025 TargetNodesMap::const_iterator node_it; 00026 if ( nodesMap.hasNodes(senderid, engine) ) 00027 for ( node_it = nodesMap.begin(senderid, engine) ; node_it != nodesMap.end(senderid, engine) ; ++node_it) { 00028 _mpiOutputBuffers[*node_it].spikeBuf().appendSpike(senderid, engineClocks[engine], engine); 00029 } 00030 00031 _localScheduler.scheduleSpike(senderid, offsetFraction, engine); 00032 } 00033 00034 void DistributedSpikeScheduler::deliverSpikes(SpikeReceiverList &listActiveSynapses, engineid_t engine, double time, int stepOffset) 00035 { 00036 _localScheduler.deliverSpikes(listActiveSynapses, engine, time, stepOffset); 00037 } 00038 00039 void DistributedSpikeScheduler::reset() 00040 { 00041 _localScheduler.reset(); 00042 for (int i = 0; i < nLocalEngines; ++i) { 00043 engineClocks[i] = 0; 00044 } 00045 } 00046 00047 void DistributedSpikeScheduler::advance(engineid_t engine) 00048 { 00049 _localScheduler.advance(engine); 00050 engineClocks[engine]++; 00051 } 00052 00053 void DistributedSpikeScheduler::nextCycle() 00054 { 00055 _localScheduler.nextCycle(); 00056 for (int i = 0 ; i < nLocalEngines ; ++i) { 00057 engineClocks[i] = 0; 00058 } 00059 }