def configure(self, config): self.S = config['shape']['S'] # number of filter cols self.R = config['shape']['R'] # number of filter rows self.H = config['shape']['H'] self.W = config['shape']['W'] self.E = config['shape']['E'] # number of ofmap rows self.F = config['shape']['F'] # number of ofmap cols self.M = config['shape']['M'] # number of output channels self.N = config['shape']['N'] # batch size self.C = config['shape']['C'] # number of input channels self.U = config['shape']['U'] # stride self.N0 = config['mapping'][ 'N0'] # size of the batch gets processed in the tile self.e = math.ceil((self.H - self.R + 1) / self.U) self.f = math.ceil((self.W - self.S + 1) / self.U) self.new_pass_config() AG.configure(self) self.nrepeat = self.e * self.f * self.N0 self.params = {'count_max': self.nrepeat - 1}
def configure(self, config): self.S = config['shape']['S'] # number of filter cols self.R = config['shape']['R'] self.M = config['shape']['M'] # number of output channels self.N = config['shape']['N'] # number of output images self.C = config['shape']['C'] self.set = False self.count = False self.attrs = {'count_max': self.S * self.R - 1} AG.configure(self)
def configure(self, config): self.depth = config['logical_depth'] # 2D shape of the datatype self.S = config['shape']['S'] # number of filter cols self.W = config['shape']['W'] # number of ifmap cols self.F = config['shape']['F'] # number of ofmap cols self.R = config['shape']['R'] # number of filter rows self.H = config['shape']['H'] # number of ifmap rows self.E = config['shape']['E'] # number of ofmap rows self.N = config['shape']['N'] # total number of ifmaps self.M = config['shape']['M'] # total number of filters self.C = config['shape']['C'] # total number of input channels self.U = config['shape']['U'] # stride size # mapping parameters needed self.k = config['mapping']['C0'] # number of tile input channels self.k_last = self.C % self.k if not self.C % self.k == 0 else self.k self.m = config['mapping']['M0'] # number of tile output channels self.m_last = self.M % self.m if not self.M % self.m == 0 else self.m self.n = config['mapping']['N0'] # number of tile ifmaps self.n_last = self.N % self.n if not self.N % self.n == 0 else self.n self.e = math.ceil((self.H - self.R + 1) / self.U) self.f = math.ceil((self.W - self.S + 1) / self.U) # generate counters according to the mapping self.n_in_chn_tile = math.ceil(self.C / self.k) self.n_out_chn_tile = math.ceil(self.M / self.m) self.n_batch_tile = math.ceil(self.N / self.n) self.n_tile = self.n_out_chn_tile * self.n_batch_tile self.entries_per_pass = math.ceil(self.m * self.e * self.f * self.n / self.width) # number of tiles the layer will incur, determines when should the address generation completely stop self.nreset = self.n_tile self.curr_tile = 0 self.new_tile_config() AG.configure(self)
def configure(self, config): self.depth = config['logical_depth'] # 2D shape of the datatype self.S = config['shape']['S'] # number of filter cols self.W = config['shape']['W'] # number of ifmap cols self.F = config['shape']['F'] # number of ofmap cols self.R = config['shape']['R'] # number of filter rows self.H = config['shape']['H'] # number of ifmap rows self.E = config['shape']['E'] # number of ofmap rows self.N = config['shape']['N'] # total number of ifmaps self.M = config['shape']['M'] # total number of filters self.C = config['shape']['C'] # total number of input channels self.U = config['shape']['U'] # stride size # mapping parameters needed self.k = config['mapping']['C0'] # number of tile input channels self.m = config['mapping']['M0'] # number of tile output channels self.n = config['mapping']['N0'] # number of tile ifmaps self.e = math.ceil((self.H - self.R + 1) / self.U) self.f = math.ceil((self.W - self.S + 1) / self.U) # generate counters according to the mapping self.n_in_chn_tile = math.ceil(self.C / self.k) self.n_out_chn_tile = math.ceil(self.M / self.m) self.n_batch_tile = math.ceil(self.N / self.n) self.n_tile = self.n_in_chn_tile * self.n_out_chn_tile * self.n_batch_tile self.addr_per_pass = self.k * self.n * self.E * self.F self.entries_per_pass = math.ceil(self.addr_per_pass / self.width) self.rounds_per_pass = math.ceil(self.entries_per_pass / self.depth) self.curr_tile = 0 self.curr_round = 0 self.nreset = self.n_tile self.new_tile_config() AG.configure(self)