info.py

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 768 行 · 第 1/2 页

PY
768
字号
class VectorStat(Statistic,Vector):    def __value__(self, run, item):        if run not in self.data:            return None        return self.data[run][item][0]    def __len__(self):        return self.x    def display(self, run=None):        import display        d = display.VectorDisplay()        d.name = self.name        d.desc = self.desc        d.value = [ value(self, run, i) for i in xrange(len(self)) ]        d.flags = self.flags        d.precision = self.precision        d.display()class Formula(Value):    def __getattribute__(self, attr):        if attr not in ( '__scalar__', '__vector__', '__value__', '__len__' ):            return super(Formula, self).__getattribute__(attr)        formula = re.sub(':', '__', self.formula)        value = eval(formula, self.source.stattop)        return getattr(value, attr)    def __str__(self):        return self.nameclass SimpleDist(Statistic):    def __init__(self, sums, squares, samples):        self.sums = sums        self.squares = squares        self.samples = samples    def display(self, name, desc, flags, precision):        import display        p = display.Print()        p.flags = flags        p.precision = precision        if self.samples > 0:            p.name = name + ".mean"            p.value = self.sums / self.samples            p.display()            p.name = name + ".stdev"            if self.samples > 1:                var = (self.samples * self.squares - self.sums ** 2) \                      / (self.samples * (self.samples - 1))                if var >= 0:                    p.value = math.sqrt(var)                else:                    p.value = 'NaN'            else:                p.value = 0.0            p.display()        p.name = name + ".samples"        p.value = self.samples        p.display()    def comparable(self, other):        return True    def __eq__(self, other):        return self.sums == other.sums and self.squares == other.squares and \               self.samples == other.samples    def __isub__(self, other):        self.sums -= other.sums        self.squares -= other.squares        self.samples -= other.samples        return self    def __iadd__(self, other):        self.sums += other.sums        self.squares += other.squares        self.samples += other.samples        return self    def __itruediv__(self, other):        if not other:            return self        self.sums /= other        self.squares /= other        self.samples /= other        return selfclass FullDist(SimpleDist):    def __init__(self, sums, squares, samples, minval, maxval,                 under, vec, over, min, max, bsize, size):        self.sums = sums        self.squares = squares        self.samples = samples        self.minval = minval        self.maxval = maxval        self.under = under        self.vec = vec        self.over = over        self.min = min        self.max = max        self.bsize = bsize        self.size = size    def display(self, name, desc, flags, precision):        import display        p = display.Print()        p.flags = flags        p.precision = precision        p.name = name + '.min_val'        p.value = self.minval        p.display()        p.name = name + '.max_val'        p.value = self.maxval        p.display()        p.name = name + '.underflow'        p.value = self.under        p.display()        i = self.min        for val in self.vec[:-1]:            p.name = name + '[%d:%d]' % (i, i + self.bsize - 1)            p.value = val            p.display()            i += self.bsize        p.name = name + '[%d:%d]' % (i, self.max)        p.value = self.vec[-1]        p.display()        p.name = name + '.overflow'        p.value = self.over        p.display()        SimpleDist.display(self, name, desc, flags, precision)    def comparable(self, other):        return self.min == other.min and self.max == other.max and \               self.bsize == other.bsize and self.size == other.size    def __eq__(self, other):        return self.sums == other.sums and self.squares == other.squares and \               self.samples == other.samples    def __isub__(self, other):        self.sums -= other.sums        self.squares -= other.squares        self.samples -= other.samples        if other.samples:            self.minval = min(self.minval, other.minval)            self.maxval = max(self.maxval, other.maxval)            self.under -= under            self.vec = map(lambda x,y: x - y, self.vec, other.vec)            self.over -= over        return self    def __iadd__(self, other):        if not self.samples and other.samples:            self = other            return self        self.sums += other.sums        self.squares += other.squares        self.samples += other.samples        if other.samples:            self.minval = min(self.minval, other.minval)            self.maxval = max(self.maxval, other.maxval)            self.under += other.under            self.vec = map(lambda x,y: x + y, self.vec, other.vec)            self.over += other.over        return self    def __itruediv__(self, other):        if not other:            return self        self.sums /= other        self.squares /= other        self.samples /= other        if self.samples:            self.under /= other            for i in xrange(len(self.vec)):                self.vec[i] /= other            self.over /= other        return selfclass Dist(Statistic):    def display(self):        import display        if not display.all and not (self.flags & flags.printable):            return        self.dist.display(self.name, self.desc, self.flags, self.precision)    def comparable(self, other):        return self.name == other.name and \               self.dist.compareable(other.dist)    def __eq__(self, other):        return self.dist == other.dist    def __isub__(self, other):        self.dist -= other.dist        return self    def __iadd__(self, other):        self.dist += other.dist        return self    def __itruediv__(self, other):        if not other:            return self        self.dist /= other        return selfclass VectorDist(Statistic):    def display(self):        import display        if not display.all and not (self.flags & flags.printable):            return        if isinstance(self.dist, SimpleDist):            return        for dist,sn,sd,i in map(None, self.dist, self.subnames, self.subdescs,                                range(len(self.dist))):            if len(sn) > 0:                name = '%s.%s' % (self.name, sn)            else:                name = '%s[%d]' % (self.name, i)            if len(sd) > 0:                desc = sd            else:                desc = self.desc            dist.display(name, desc, self.flags, self.precision)        if (self.flags & flags.total) or 1:            if isinstance(self.dist[0], SimpleDist):                disttotal = SimpleDist( \                    reduce(sums, [d.sums for d in self.dist]),                    reduce(sums, [d.squares for d in self.dist]),                    reduce(sums, [d.samples for d in self.dist]))            else:                disttotal = FullDist( \                    reduce(sums, [d.sums for d in self.dist]),                    reduce(sums, [d.squares for d in self.dist]),                    reduce(sums, [d.samples for d in self.dist]),                    min([d.minval for d in self.dist]),                    max([d.maxval for d in self.dist]),                    reduce(sums, [d.under for d in self.dist]),                    reduce(sums, [d.vec for d in self.dist]),                    reduce(sums, [d.over for d in self.dist]),                    dist[0].min,                    dist[0].max,                    dist[0].bsize,                    dist[0].size)            name = '%s.total' % (self.name)            desc = self.desc            disttotal.display(name, desc, self.flags, self.precision)    def comparable(self, other):        return self.name == other.name and \               alltrue(map(lambda x, y : x.comparable(y),                           self.dist,                           other.dist))    def __eq__(self, other):        return alltrue(map(lambda x, y : x == y, self.dist, other.dist))    def __isub__(self, other):        if isinstance(self.dist, (list, tuple)) and \               isinstance(other.dist, (list, tuple)):            for sd,od in zip(self.dist, other.dist):                sd -= od        else:            self.dist -= other.dist        return self    def __iadd__(self, other):        if isinstance(self.dist, (list, tuple)) and \               isinstance(other.dist, (list, tuple)):            for sd,od in zip(self.dist, other.dist):                sd += od        else:            self.dist += other.dist        return self    def __itruediv__(self, other):        if not other:            return self        if isinstance(self.dist, (list, tuple)):            for dist in self.dist:                dist /= other        else:            self.dist /= other        return selfclass Vector2d(Statistic):    def display(self):        import display        if not display.all and not (self.flags & flags.printable):            return        d = display.VectorDisplay()        d.__dict__.update(self.__dict__)        if self.__dict__.has_key('ysubnames'):            ysubnames = list(self.ysubnames)            slack = self.x - len(ysubnames)            if slack > 0:                ysubnames.extend(['']*slack)        else:            ysubnames = range(self.x)        for x,sname in enumerate(ysubnames):            o = x * self.y            d.value = self.value[o:o+self.y]            d.name = '%s[%s]' % (self.name, sname)            d.display()        if self.flags & flags.total:            d.value = []            for y in range(self.y):                xtot = 0.0                for x in range(self.x):                    xtot += self.value[y + x * self.x]                d.value.append(xtot)            d.name = self.name + '.total'            d.display()    def comparable(self, other):        return self.name == other.name and self.x == other.x and \               self.y == other.y    def __eq__(self, other):        return True    def __isub__(self, other):        return self    def __iadd__(self, other):        return self    def __itruediv__(self, other):        if not other:            return self        return selfdef NewStat(source, data):    stat = None    if data.type == 'SCALAR':        stat = ScalarStat()    elif data.type == 'VECTOR':        stat = VectorStat()    elif data.type == 'DIST':        stat = Dist()    elif data.type == 'VECTORDIST':        stat = VectorDist()    elif data.type == 'VECTOR2D':        stat = Vector2d()    elif data.type == 'FORMULA':        stat = Formula()    stat.__dict__['source'] = source    stat.__dict__['ticks'] = None    stat.__dict__.update(data.__dict__)    return stat

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?