ConnectivityMatrix::ConnectivityMatrix( const network::Generator& net, const ConfigurationImpl& conf, const mapper_t& mapper, const bool verifySources) : m_mapper(mapper), m_fractionalBits(conf.fractionalBits()), m_maxDelay(0), m_writeOnlySynapses(conf.writeOnlySynapses()) { if(conf.stdpFunction()) { m_stdp = StdpProcess(conf.stdpFunction().get(), m_fractionalBits); } construction::RCM<nidx_t, RSynapse, 32> m_racc(conf, net, RSynapse(~0U,0)); network::synapse_iterator i = net.synapse_begin(); network::synapse_iterator i_end = net.synapse_end(); for( ; i != i_end; ++i) { nidx_t source = mapper.localIdx(i->source); nidx_t target = mapper.localIdx(i->target()); sidx_t sidx = addSynapse(source, target, *i); m_racc.addSynapse(target, RSynapse(source, i->delay), *i, sidx); } //! \todo avoid two passes here finalizeForward(mapper, verifySources); m_rcm.reset(new runtime::RCM(m_racc)); }
void Master::distributeSynapses(const Mapper& mapper, const network::Generator& net) { typedef std::vector<Synapse> svector; svector input; // dummy std::vector<svector> output(m_world.size()); unsigned queued = 0; //! \todo pass this in const unsigned bufferSize = 2 << 11; for(network::synapse_iterator s = net.synapse_begin(); s != net.synapse_end(); ++s, ++queued) { int sourceRank = mapper.rankOf(s->source); int targetRank = mapper.rankOf(s->target()); output.at(sourceRank).push_back(*s); if(sourceRank != targetRank) { output.at(targetRank).push_back(*s); } if(queued == bufferSize) { flushBuffer(SYNAPSE_VECTOR, input, output, m_world); queued = 0; } } flushBuffer(SYNAPSE_VECTOR, input, output, m_world); int tag = SYNAPSES_END; broadcast(m_world, tag, MASTER); }