def _init_comm_bufs(self): """ Buffers for sending/receiving data from other modules. Notes ----- Must be executed after `_init_port_dicts()`. """ # Buffers (and their interfaces and MPI types) for receiving data # transmitted from source modules: self._in_buf = {} self._in_buf['gpot'] = {} self._in_buf['spike'] = {} self._in_buf_int = {} self._in_buf_int['gpot'] = {} self._in_buf_int['spike'] = {} self._in_buf_mtype = {} self._in_buf_mtype['gpot'] = {} self._in_buf_mtype['spike'] = {} for in_id in self._in_ids: self._in_buf['gpot'][in_id] = \ gpuarray.empty(len(self._in_port_dict_ids['gpot'][in_id]), self.pm['gpot'].dtype) self._in_buf_int['gpot'][in_id] = bufint(self._in_buf['gpot'][in_id]) self._in_buf_mtype['gpot'][in_id] = \ dtype_to_mpi(self._in_buf['gpot'][in_id].dtype) self._in_buf['spike'][in_id] = \ gpuarray.empty(len(self._in_port_dict_ids['spike'][in_id]), self.pm['spike'].dtype) self._in_buf_int['spike'][in_id] = bufint(self._in_buf['spike'][in_id]) self._in_buf_mtype['spike'][in_id] = \ dtype_to_mpi(self._in_buf['spike'][in_id].dtype) # Buffers (and their interfaces and MPI types) for transmitting data to # destination modules: self._out_buf = {} self._out_buf['gpot'] = {} self._out_buf['spike'] = {} self._out_buf_int = {} self._out_buf_int['gpot'] = {} self._out_buf_int['spike'] = {} self._out_buf_mtype = {} self._out_buf_mtype['gpot'] = {} self._out_buf_mtype['spike'] = {} for out_id in self._out_ids: self._out_buf['gpot'][out_id] = \ gpuarray.empty(len(self._out_port_dict_ids['gpot'][out_id]), self.pm['gpot'].dtype) self._out_buf_int['gpot'][out_id] = bufint(self._out_buf['gpot'][out_id]) self._out_buf_mtype['gpot'][out_id] = \ dtype_to_mpi(self._out_buf['gpot'][out_id].dtype) self._out_buf['spike'][out_id] = \ gpuarray.empty(len(self._out_port_dict_ids['spike'][out_id]), self.pm['spike'].dtype) self._out_buf_int['spike'][out_id] = bufint(self._out_buf['spike'][out_id]) self._out_buf_mtype['spike'][out_id] = \ dtype_to_mpi(self._out_buf['spike'][out_id].dtype)
def _init_comm_bufs(self): """ Buffers for receiving data from other modules. Notes ----- Must be executed after `_init_port_dicts()`. """ # Buffer interface to and MPI type of this module's port data array: self._data_int = {} self._data_int['gpot'] = bufint(self.data['gpot']) self._data_int['spike'] = bufint(self.data['spike']) self._data_mtype = {} self._data_mtype['gpot'] = dtype_to_mpi(self.data['gpot'].dtype) self._data_mtype['spike'] = dtype_to_mpi(self.data['spike'].dtype) # Buffers (and their interfaces and MPI types) for receiving data # transmitted from source modules: self._in_buf = {} self._in_buf['gpot'] = {} self._in_buf['spike'] = {} self._in_buf_int = {} self._in_buf_int['gpot'] = {} self._in_buf_int['spike'] = {} self._in_buf_mtype = {} self._in_buf_mtype['gpot'] = {} self._in_buf_mtype['spike'] = {} for in_id in self._in_ids: # Get interfaces of pattern connecting the current module to # source module `in_id`; `int_1` is connected to the current # module, `int_0` is connected to the other module: pat = self.routing_table[in_id, self.id]['pattern'] int_0 = self.routing_table[in_id, self.id]['int_0'] int_1 = self.routing_table[in_id, self.id]['int_1'] # The buffers must be the same size as the port data arrays of the # modules from which they received data: self._in_buf['gpot'][in_id] = \ gpuarray.empty(len(self.pm_all['gpot'][in_id]), self.pm['gpot'].dtype) self._in_buf_int['gpot'][in_id] = bufint( self._in_buf['gpot'][in_id]) self._in_buf_mtype['gpot'][in_id] = \ dtype_to_mpi(self._in_buf['gpot'][in_id]) self._in_buf['spike'][in_id] = \ gpuarray.empty(len(self.pm_all['spike'][in_id]), self.pm['spike'].dtype) self._in_buf_int['spike'][in_id] = bufint( self._in_buf['spike'][in_id]) self._in_buf_mtype['spike'][in_id] = \ dtype_to_mpi(self._in_buf['spike'][in_id])
def _init_comm_bufs(self): """ Buffers for receiving data from other modules. Notes ----- Must be executed after `_init_port_dicts()`. """ # Buffer interface to and MPI type of this module's port data array: self._data_int = {} self._data_int['gpot'] = bufint(self.data['gpot']) self._data_int['spike'] = bufint(self.data['spike']) self._data_mtype = {} self._data_mtype['gpot'] = dtype_to_mpi(self.data['gpot'].dtype) self._data_mtype['spike'] = dtype_to_mpi(self.data['spike'].dtype) # Buffers (and their interfaces and MPI types) for receiving data # transmitted from source modules: self._in_buf = {} self._in_buf['gpot'] = {} self._in_buf['spike'] = {} self._in_buf_int = {} self._in_buf_int['gpot'] = {} self._in_buf_int['spike'] = {} self._in_buf_mtype = {} self._in_buf_mtype['gpot'] = {} self._in_buf_mtype['spike'] = {} for in_id in self._in_ids: # Get interfaces of pattern connecting the current module to # source module `in_id`; `int_1` is connected to the current # module, `int_0` is connected to the other module: pat = self.routing_table[in_id, self.id]['pattern'] int_0 = self.routing_table[in_id, self.id]['int_0'] int_1 = self.routing_table[in_id, self.id]['int_1'] # The buffers must be the same size as the port data arrays of the # modules from which they received data: self._in_buf['gpot'][in_id] = \ gpuarray.empty(len(self.pm_all['gpot'][in_id]), self.pm['gpot'].dtype) self._in_buf_int['gpot'][in_id] = bufint(self._in_buf['gpot'][in_id]) self._in_buf_mtype['gpot'][in_id] = \ dtype_to_mpi(self._in_buf['gpot'][in_id]) self._in_buf['spike'][in_id] = \ gpuarray.empty(len(self.pm_all['spike'][in_id]), self.pm['spike'].dtype) self._in_buf_int['spike'][in_id] = bufint(self._in_buf['spike'][in_id]) self._in_buf_mtype['spike'][in_id] = \ dtype_to_mpi(self._in_buf['spike'][in_id])
def _sync(self): """ Send output data and receive input data. """ if self.time_sync: start = time.time() req = MPI.Request() 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): # Get source ports in current module that are connected to the # destination module: data_gpot = self.pm['gpot'].get_by_inds(self._out_port_dict_ids['gpot'][dest_id]) data_spike = self.pm['spike'].get_by_inds(self._out_port_dict_ids['spike'][dest_id]) if not self.time_sync: self.log_info('gpot data being sent to %s: %s' % \ (dest_id, str(data_gpot))) self.log_info('spike data being sent to %s: %s' % \ (dest_id, str(data_spike))) r = MPI.COMM_WORLD.Isend([data_gpot, dtype_to_mpi(data_gpot.dtype)], dest_rank, GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Isend([data_spike, dtype_to_mpi(data_spike.dtype)], 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: received_gpot = [] received_spike = [] ind_in_gpot_list = [] ind_in_spike_list = [] for src_id, src_rank in zip(self._in_ids, self._in_ranks): r = MPI.COMM_WORLD.Irecv([self.data_in['gpot'][src_id], dtype_to_mpi(data_gpot.dtype)], source=src_rank, tag=GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Irecv([self.data_in['spike'][src_id], dtype_to_mpi(data_spike.dtype)], 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: for src_id in self._in_ids: ind_in_gpot = self._in_port_dict_ids['gpot'][src_id] self.pm['gpot'].set_by_inds(ind_in_gpot, self.data_in['gpot'][src_id]) ind_in_spike = self._in_port_dict_ids['spike'][src_id] self.pm['spike'].set_by_inds(ind_in_spike, self.data_in['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.data_in['gpot'][src_id]) n_spike += len(self.data_in['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 _init_comm_bufs(self): """ Buffers for sending/receiving data from other modules. Notes ----- Must be executed after `_init_port_dicts()`. """ # Buffers (and their interfaces and MPI types) for receiving data # transmitted from source modules: self._in_buf = {} self._in_buf['gpot'] = {} self._in_buf['spike'] = {} self._in_buf_int = {} self._in_buf_int['gpot'] = {} self._in_buf_int['spike'] = {} self._in_buf_mtype = {} self._in_buf_mtype['gpot'] = {} self._in_buf_mtype['spike'] = {} for in_id in self._in_ids: n_gpot = self._in_buf_len['gpot'][in_id] if n_gpot: self._in_buf['gpot'][in_id] = \ gpuarray.empty(n_gpot, self.pm['gpot'].dtype) self._in_buf_int['gpot'][in_id] = \ bufint(self._in_buf['gpot'][in_id]) self._in_buf_mtype['gpot'][in_id] = \ dtype_to_mpi(self._in_buf['gpot'][in_id].dtype) else: self._in_buf['gpot'][in_id] = None n_spike = self._in_buf_len['spike'][in_id] if n_spike: self._in_buf['spike'][in_id] = \ gpuarray.empty(n_spike, self.pm['spike'].dtype) self._in_buf_int['spike'][in_id] = \ bufint(self._in_buf['spike'][in_id]) self._in_buf_mtype['spike'][in_id] = \ dtype_to_mpi(self._in_buf['spike'][in_id].dtype) else: self._in_buf['spike'][in_id] = None # Buffers (and their interfaces and MPI types) for transmitting data to # destination modules: self._out_buf = {} self._out_buf['gpot'] = {} self._out_buf['spike'] = {} self._out_buf_int = {} self._out_buf_int['gpot'] = {} self._out_buf_int['spike'] = {} self._out_buf_mtype = {} self._out_buf_mtype['gpot'] = {} self._out_buf_mtype['spike'] = {} for out_id in self._out_ids: n_gpot = len(self._out_port_dict_ids['gpot'][out_id]) if n_gpot: self._out_buf['gpot'][out_id] = \ gpuarray.empty(n_gpot, self.pm['gpot'].dtype) self._out_buf_int['gpot'][out_id] = \ bufint(self._out_buf['gpot'][out_id]) self._out_buf_mtype['gpot'][out_id] = \ dtype_to_mpi(self._out_buf['gpot'][out_id].dtype) else: self._out_buf['gpot'][out_id] = None n_spike = len(self._out_port_dict_ids['spike'][out_id]) if n_spike: self._out_buf['spike'][out_id] = \ gpuarray.empty(n_spike, self.pm['spike'].dtype) self._out_buf_int['spike'][out_id] = \ bufint(self._out_buf['spike'][out_id]) self._out_buf_mtype['spike'][out_id] = \ dtype_to_mpi(self._out_buf['spike'][out_id].dtype) else: self._out_buf['spike'][out_id] = None
def _sync(self): """ Send output data and receive input data. """ if self.time_sync: start = time.time() req = MPI.Request() 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): # Get source ports in current module that are connected to the # destination module: data_gpot = self.pm['gpot'].get_by_inds( self._out_port_dict_ids['gpot'][dest_id]) data_spike = self.pm['spike'].get_by_inds( self._out_port_dict_ids['spike'][dest_id]) if not self.time_sync: self.log_info('gpot data being sent to %s: %s' % \ (dest_id, str(data_gpot))) self.log_info('spike data being sent to %s: %s' % \ (dest_id, str(data_spike))) r = MPI.COMM_WORLD.Isend( [data_gpot, dtype_to_mpi(data_gpot.dtype)], dest_rank, GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Isend( [data_spike, dtype_to_mpi(data_spike.dtype)], 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: received_gpot = [] received_spike = [] ind_in_gpot_list = [] ind_in_spike_list = [] for src_id, src_rank in zip(self._in_ids, self._in_ranks): r = MPI.COMM_WORLD.Irecv( [self.data_in['gpot'][src_id], dtype_to_mpi(data_gpot.dtype)], source=src_rank, tag=GPOT_TAG) requests.append(r) r = MPI.COMM_WORLD.Irecv([ self.data_in['spike'][src_id], dtype_to_mpi(data_spike.dtype) ], 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: for src_id in self._in_ids: ind_in_gpot = self._in_port_dict_ids['gpot'][src_id] self.pm['gpot'].set_by_inds(ind_in_gpot, self.data_in['gpot'][src_id]) ind_in_spike = self._in_port_dict_ids['spike'][src_id] self.pm['spike'].set_by_inds(ind_in_spike, self.data_in['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.data_in['gpot'][src_id]) n_spike += len(self.data_in['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)