Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve get_connections performance #490

Merged
merged 6 commits into from
Oct 3, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 39 additions & 58 deletions nestkernel/connection_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1018,7 +1018,7 @@ nest::ConnectionManager::get_num_connections( synindex syn_id ) const
ArrayDatum
nest::ConnectionManager::get_connections( DictionaryDatum params ) const
{
ArrayDatum connectome;
std::deque< ConnectionID > connectome;

const Token& source_t = params->lookup( names::source );
const Token& target_t = params->lookup( names::target );
Expand Down Expand Up @@ -1062,26 +1062,49 @@ nest::ConnectionManager::get_connections( DictionaryDatum params ) const
syn_id < kernel().model_manager.get_num_synapse_prototypes();
++syn_id )
{
ArrayDatum conn;
get_connections( conn, source_a, target_a, syn_id, synapse_label );
if ( conn.size() > 0 )
connectome.push_back( new ArrayDatum( conn ) );
get_connections( connectome, source_a, target_a, syn_id, synapse_label );
}
}

return connectome;
ArrayDatum result;
result.reserve( connectome.size() );

while ( not connectome.empty() )
{
result.push_back( ConnectionDatum( connectome.front() ) );
connectome.pop_front();
}

return result;
}

// Helper method, implemented as operator<<(), that removes ConnectionIDs from
// input deque and appends them to output deque.
static inline std::deque< nest::ConnectionID >& operator<<(
std::deque< nest::ConnectionID >& out,
std::deque< nest::ConnectionID >& in )
{
while ( not in.empty() )
{
out.push_back( in.front() );
in.pop_front();
}

return out;
}

void
nest::ConnectionManager::get_connections( ArrayDatum& connectome,
nest::ConnectionManager::get_connections(
std::deque< ConnectionID >& connectome,
TokenArray const* source,
TokenArray const* target,
size_t syn_id,
long synapse_label ) const
{
size_t num_connections = get_num_connections( syn_id );

connectome.reserve( num_connections );
if ( get_num_connections( syn_id ) == 0 )
{
return;
}

if ( source == 0 and target == 0 )
{
Expand All @@ -1093,22 +1116,8 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
for ( thread t = 0; t < kernel().vp_manager.get_num_threads(); ++t )
{
#endif
ArrayDatum conns_in_thread;
size_t num_connections_in_thread = 0;
// Count how many connections we will have.
for ( tSConnector::const_nonempty_iterator it =
connections_[ t ].nonempty_begin();
it != connections_[ t ].nonempty_end();
++it )
{
num_connections_in_thread +=
validate_pointer( *it )->get_num_connections();
}
std::deque< ConnectionID > conns_in_thread;

#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
conns_in_thread.reserve( num_connections_in_thread );
for ( index source_id = 1; source_id < connections_[ t ].size();
++source_id )
{
Expand All @@ -1122,7 +1131,7 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
connectome.append_move( conns_in_thread );
connectome << conns_in_thread;
}
}

Expand All @@ -1138,22 +1147,8 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
for ( thread t = 0; t < kernel().vp_manager.get_num_threads(); ++t )
{
#endif
ArrayDatum conns_in_thread;
size_t num_connections_in_thread = 0;
// Count how many connections we will have maximally.
for ( tSConnector::const_nonempty_iterator it =
connections_[ t ].nonempty_begin();
it != connections_[ t ].nonempty_end();
++it )
{
num_connections_in_thread +=
validate_pointer( *it )->get_num_connections();
}
std::deque< ConnectionID > conns_in_thread;

#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
conns_in_thread.reserve( num_connections_in_thread );
for ( index source_id = 1; source_id < connections_[ t ].size();
++source_id )
{
Expand All @@ -1177,7 +1172,7 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
connectome.append_move( conns_in_thread );
connectome << conns_in_thread;
}
}
return;
Expand All @@ -1192,22 +1187,8 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
for ( thread t = 0; t < kernel().vp_manager.get_num_threads(); ++t )
{
#endif
ArrayDatum conns_in_thread;
size_t num_connections_in_thread = 0;
// Count how many connections we will have maximally.
for ( tSConnector::const_nonempty_iterator it =
connections_[ t ].nonempty_begin();
it != connections_[ t ].nonempty_end();
++it )
{
num_connections_in_thread +=
validate_pointer( *it )->get_num_connections();
}
std::deque< ConnectionID > conns_in_thread;

#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
conns_in_thread.reserve( num_connections_in_thread );
for ( index s = 0; s < source->size(); ++s )
{
size_t source_id = source->get( s );
Expand Down Expand Up @@ -1242,7 +1223,7 @@ nest::ConnectionManager::get_connections( ArrayDatum& connectome,
#ifdef _OPENMP
#pragma omp critical( get_connections )
#endif
connectome.append_move( conns_in_thread );
connectome << conns_in_thread;
}
}
return;
Expand Down
3 changes: 2 additions & 1 deletion nestkernel/connection_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "sparsetable.h"

// Includes from nestkernel:
#include "connection_id.h"
#include "conn_builder.h"
#include "gid_collection.h"
#include "nest_time.h"
Expand Down Expand Up @@ -210,7 +211,7 @@ class ConnectionManager : public ManagerInterface
*/
ArrayDatum get_connections( DictionaryDatum dict ) const;

void get_connections( ArrayDatum& connectome,
void get_connections( std::deque< ConnectionID >& connectome,
TokenArray const* source,
TokenArray const* target,
size_t syn_id,
Expand Down
45 changes: 23 additions & 22 deletions nestkernel/connector_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
// C++ includes:
#include <cstdlib>
#include <vector>
#include <deque>

// Includes from libnestutil:
#include "compose.hpp"
Expand Down Expand Up @@ -149,14 +150,14 @@ class ConnectorBase
size_t thrd,
synindex synapse_id,
long synapse_label,
ArrayDatum& conns ) const = 0;
std::deque< ConnectionID >& conns ) const = 0;

virtual void get_connections( size_t source_gid,
size_t target_gid,
size_t thrd,
size_t synapse_id,
long synapse_label,
ArrayDatum& conns ) const = 0;
std::deque< ConnectionID >& conns ) const = 0;

virtual void get_target_gids( std::vector< size_t >& target_gids,
size_t thrd,
Expand Down Expand Up @@ -379,17 +380,17 @@ class Connector : public vector_like< ConnectionT >
size_t thrd,
synindex synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
for ( size_t i = 0; i < K; i++ )
if ( get_syn_id() == synapse_id )
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ i ].get_label() == synapse_label )
conns.push_back( ConnectionDatum( ConnectionID( source_gid,
conns.push_back( ConnectionID( source_gid,
C_[ i ].get_target( thrd )->get_gid(),
thrd,
synapse_id,
i ) ) );
i ) );
}

void
Expand All @@ -398,15 +399,15 @@ class Connector : public vector_like< ConnectionT >
size_t thrd,
size_t synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
for ( size_t i = 0; i < K; i++ )
if ( get_syn_id() == synapse_id )
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ i ].get_label() == synapse_label )
if ( C_[ i ].get_target( thrd )->get_gid() == target_gid )
conns.push_back( ConnectionDatum(
ConnectionID( source_gid, target_gid, thrd, synapse_id, i ) ) );
conns.push_back(
ConnectionID( source_gid, target_gid, thrd, synapse_id, i ) );
}

/**
Expand Down Expand Up @@ -612,18 +613,18 @@ class Connector< 1, ConnectionT > : public vector_like< ConnectionT >
size_t thrd,
synindex synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
if ( get_syn_id() == synapse_id )
{
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ 0 ].get_label() == synapse_label )
{
conns.push_back( ConnectionDatum( ConnectionID( source_gid,
conns.push_back( ConnectionID( source_gid,
C_[ 0 ].get_target( thrd )->get_gid(),
thrd,
synapse_id,
0 ) ) );
0 ) );
}
}
}
Expand All @@ -634,16 +635,16 @@ class Connector< 1, ConnectionT > : public vector_like< ConnectionT >
size_t thrd,
size_t synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
if ( get_syn_id() == synapse_id )
{
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ 0 ].get_label() == synapse_label )
{
if ( C_[ 0 ].get_target( thrd )->get_gid() == target_gid )
conns.push_back( ConnectionDatum(
ConnectionID( source_gid, target_gid, thrd, synapse_id, 0 ) ) );
conns.push_back(
ConnectionID( source_gid, target_gid, thrd, synapse_id, 0 ) );
}
}
}
Expand Down Expand Up @@ -849,17 +850,17 @@ class Connector< K_CUTOFF, ConnectionT > : public vector_like< ConnectionT >
size_t thrd,
synindex synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
for ( size_t i = 0; i < C_.size(); i++ )
if ( get_syn_id() == synapse_id )
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ i ].get_label() == synapse_label )
conns.push_back( ConnectionDatum( ConnectionID( source_gid,
conns.push_back( ConnectionID( source_gid,
C_[ i ].get_target( thrd )->get_gid(),
thrd,
synapse_id,
i ) ) );
i ) );
}

void
Expand All @@ -868,15 +869,15 @@ class Connector< K_CUTOFF, ConnectionT > : public vector_like< ConnectionT >
size_t thrd,
size_t synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
if ( get_syn_id() == synapse_id )
for ( size_t i = 0; i < C_.size(); i++ )
if ( synapse_label == UNLABELED_CONNECTION
|| C_[ i ].get_label() == synapse_label )
if ( C_[ i ].get_target( thrd )->get_gid() == target_gid )
conns.push_back( ConnectionDatum(
ConnectionID( source_gid, target_gid, thrd, synapse_id, i ) ) );
conns.push_back(
ConnectionID( source_gid, target_gid, thrd, synapse_id, i ) );
}

void
Expand Down Expand Up @@ -1028,7 +1029,7 @@ class HetConnector : public std::vector< ConnectorBase* >, public ConnectorBase
size_t thrd,
synindex synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
for ( size_t i = 0; i < size(); i++ )
at( i )->get_connections(
Expand All @@ -1041,7 +1042,7 @@ class HetConnector : public std::vector< ConnectorBase* >, public ConnectorBase
size_t thrd,
size_t synapse_id,
long synapse_label,
ArrayDatum& conns ) const
std::deque< ConnectionID >& conns ) const
{
for ( size_t i = 0; i < size(); i++ )
at( i )->get_connections(
Expand Down