def _sync(self): """ Send output data and receive input data. """ if self.time_sync: start = time.time() requests = [] # For each destination module, extract elements from the current # module's port data array, copy them to a contiguous array, and # transmit the latter: for dest_id, dest_rank in zip(self._out_ids, self._out_ranks): # Copy data into destination buffer: if self._out_buf['gpot'][dest_id] is not None: set_by_inds(self._out_buf['gpot'][dest_id], self._out_port_dict_ids['gpot'][dest_id], self.data['gpot'], 'src') if not self.time_sync: self.log_info('gpot data sent to %s: %s' % \ (dest_id, str(self._out_buf['gpot'][dest_id]))) r = MPI.COMM_WORLD.Isend([self._out_buf_int['gpot'][dest_id], self._out_buf_mtype['gpot'][dest_id]], dest_rank, GPOT_TAG) requests.append(r) if self._out_buf['spike'][dest_id] is not None: set_by_inds(self._out_buf['spike'][dest_id], self._out_port_dict_ids['spike'][dest_id], self.data['spike'], 'src') if not self.time_sync: self.log_info('spike data sent to %s: %s' % \ (dest_id, str(self._out_buf['spike'][dest_id]))) r = MPI.COMM_WORLD.Isend([self._out_buf_int['spike'][dest_id], self._out_buf_mtype['spike'][dest_id]], dest_rank, SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('sending to %s' % dest_id) if not self.time_sync: self.log_info('sent all data from %s' % self.id) # For each source module, receive elements and copy them into the # current module's port data array: for src_id, src_rank in zip(self._in_ids, self._in_ranks): if self._in_buf['gpot'][src_id] is not None: r = MPI.COMM_WORLD.Irecv([self._in_buf_int['gpot'][src_id], self._in_buf_mtype['gpot'][src_id]], source=src_rank, tag=GPOT_TAG) requests.append(r) if self._in_buf['spike'][src_id] is not None: r = MPI.COMM_WORLD.Irecv([self._in_buf_int['spike'][src_id], self._in_buf_mtype['spike'][src_id]], source=src_rank, tag=SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('receiving from %s' % src_id) if requests: self.req.Waitall(requests) if not self.time_sync: self.log_info('all data were received by %s' % self.id) # Copy received elements into the current module's data array: for src_id in self._in_ids: if self._in_buf['gpot'][src_id] is not None: if not self.time_sync: self.log_info('gpot data received from %s: %s' % \ (src_id, str(self._in_buf['gpot'][src_id]))) set_by_inds_from_inds(self.data['gpot'], self._in_port_dict_ids['gpot'][src_id], self._in_buf['gpot'][src_id], self._in_port_dict_buf_ids['gpot'][src_id]) if self._in_buf['spike'][src_id] is not None: if not self.time_sync: self.log_info('spike data received from %s: %s' % \ (src_id, str(self._in_buf['spike'][src_id]))) set_by_inds_from_inds(self.data['spike'], self._in_port_dict_ids['spike'][src_id], self._in_buf['spike'][src_id], self._in_port_dict_buf_ids['spike'][src_id]) # Save timing data: if self.time_sync: stop = time.time() n_gpot = 0 n_spike = 0 for src_id in self._in_ids: n_gpot += len(self._in_buf['gpot'][src_id]) n_spike += len(self._in_buf['spike'][src_id]) self.log_info('sent timing data to master') self.intercomm.isend(['sync_time', (self.rank, self.steps, start, stop, n_gpot*self.pm['gpot'].dtype.itemsize+\ n_spike*self.pm['spike'].dtype.itemsize)], dest=0, tag=self._ctrl_tag) else: self.log_info('saved all data received by %s' % self.id)
def _sync(self): """ Send output data and receive input data. """ if self.time_sync: start = time.time() req = MPI.Request() requests = [] # Transmit the entire port data array to each destination module: dest_ids = self.routing_table.dest_ids(self.id) for dest_id in dest_ids: dest_rank = self.rank_to_id[:dest_id] r = MPI.COMM_WORLD.Isend( [self._data_int['gpot'], self._data_mtype['gpot']], dest_rank, GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Isend( [self._data_int['spike'], self._data_mtype['spike']], dest_rank, SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('sending to %s' % dest_id) if not self.time_sync: self.log_info('sent all data from %s' % self.id) # For each source module, receive elements and copy them into the # current module's port data array: src_ids = self.routing_table.src_ids(self.id) for src_id in src_ids: src_rank = self.rank_to_id[:src_id] r = MPI.COMM_WORLD.Irecv([ self._in_buf_int['gpot'][src_id], self._in_buf_mtype['gpot'][src_id] ], source=src_rank, tag=GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Irecv([ self._in_buf_int['spike'][src_id], self._in_buf_mtype['spike'][src_id] ], source=src_rank, tag=SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('receiving from %s' % src_id) req.Waitall(requests) if not self.time_sync: self.log_info('received all data received by %s' % self.id) # Copy received elements into the current module's data array: n_gpot = 0 n_spike = 0 for src_id in src_ids: ind_from_gpot = self._from_port_dict_ids['gpot'][src_id] ind_in_gpot = self._in_port_dict_ids['gpot'][src_id] set_by_inds_from_inds(self.data['gpot'], ind_in_gpot, self._in_buf['gpot'][src_id], ind_from_gpot) n_gpot += len(self._in_buf['gpot'][src_id]) ind_from_spike = self._from_port_dict_ids['spike'][src_id] ind_in_spike = self._in_port_dict_ids['spike'][src_id] set_by_inds_from_inds(self.data['spike'], ind_in_spike, self._in_buf['spike'][src_id], ind_from_spike) n_spike += len(self._in_buf['spike'][src_id]) # Save timing data: if self.time_sync: stop = time.time() #self.log_info('sent timing data to master') self.intercomm.isend(['time', (self.rank, self.steps, start, stop, n_gpot*self.pm['gpot'].dtype.itemsize+\ n_spike*self.pm['spike'].dtype.itemsize)], dest=0, tag=self._ctrl_tag) else: self.log_info('saved all data received by %s' % self.id)
def _sync(self): """ Send output data and receive input data. """ if self.time_sync: start = time.time() req = MPI.Request() requests = [] # Transmit the entire port data array to each destination module: dest_ids = self.routing_table.dest_ids(self.id) for dest_id in dest_ids: dest_rank = self.rank_to_id[:dest_id] r = MPI.COMM_WORLD.Isend([self._data_int['gpot'], self._data_mtype['gpot']], dest_rank, GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Isend([self._data_int['spike'], self._data_mtype['spike']], dest_rank, SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('sending to %s' % dest_id) if not self.time_sync: self.log_info('sent all data from %s' % self.id) # For each source module, receive elements and copy them into the # current module's port data array: src_ids = self.routing_table.src_ids(self.id) for src_id in src_ids: src_rank = self.rank_to_id[:src_id] r = MPI.COMM_WORLD.Irecv([self._in_buf_int['gpot'][src_id], self._in_buf_mtype['gpot'][src_id]], source=src_rank, tag=GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Irecv([self._in_buf_int['spike'][src_id], self._in_buf_mtype['spike'][src_id]], source=src_rank, tag=SPIKE_TAG) requests.append(r) if not self.time_sync: self.log_info('receiving from %s' % src_id) req.Waitall(requests) if not self.time_sync: self.log_info('received all data received by %s' % self.id) # Copy received elements into the current module's data array: n_gpot = 0 n_spike = 0 for src_id in src_ids: ind_from_gpot = self._from_port_dict_ids['gpot'][src_id] ind_in_gpot = self._in_port_dict_ids['gpot'][src_id] set_by_inds_from_inds(self.data['gpot'], ind_in_gpot, self._in_buf['gpot'][src_id], ind_from_gpot) n_gpot += len(self._in_buf['gpot'][src_id]) ind_from_spike = self._from_port_dict_ids['spike'][src_id] ind_in_spike = self._in_port_dict_ids['spike'][src_id] set_by_inds_from_inds(self.data['spike'], ind_in_spike, self._in_buf['spike'][src_id], ind_from_spike) n_spike += len(self._in_buf['spike'][src_id]) # Save timing data: if self.time_sync: stop = time.time() #self.log_info('sent timing data to master') self.intercomm.isend(['time', (self.rank, self.steps, start, stop, n_gpot*self.pm['gpot'].dtype.itemsize+\ n_spike*self.pm['spike'].dtype.itemsize)], dest=0, tag=self._ctrl_tag) else: self.log_info('saved all data received by %s' % self.id)