Home | History | Annotate | Download | only in hardware_TLBMissCost
      1 # Copyright 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 import perf_measurement
      7 import numpy
      8 
      9 from autotest_lib.client.bin import test
     10 from autotest_lib.client.bin import utils
     11 from autotest_lib.client.common_lib import error
     12 
     13 # This event counts cycles when the page miss handler is servicing page walks
     14 # caused by ITLB misses. Raw event codes for x86 microarchitectures can be
     15 # found at Intel Open Source technology center website:
     16 # https://download.01.org/perfmon
     17 RAW_PAGE_WALK_EVENT_CODES = {
     18     'Broadwell': 'r1085',
     19     'Haswell': 'r1085',
     20     'IvyBridge': 'r0485',
     21     'SandyBridge': 'r0485',
     22     'Silvermont': 'r0305',
     23 }
     24 
     25 class hardware_TLBMissCost(test.test):
     26     """Calculates cost of one iTLB miss in
     27     terms of cycles spent on page walking.
     28     """
     29 
     30     version = 1
     31     preserve_srcdir = True
     32 
     33     def initialize(self, events=('cycles', 'iTLB-misses')):
     34         self.job.require_gcc()
     35         self.events = events
     36 
     37     def setup(self):
     38         chost = os.getenv('CHOST', '')
     39         if chost == 'x86_64-cros-linux-gnu':
     40             os.chdir(self.srcdir)
     41             utils.make('clean')
     42             utils.make()
     43 
     44     def warmup(self):
     45         uarch = utils.get_intel_cpu_uarch()
     46         if uarch not in RAW_PAGE_WALK_EVENT_CODES:
     47             raise error.TestNAError('Unsupported microarchitecture.')
     48         self.pw_event = RAW_PAGE_WALK_EVENT_CODES.get(uarch)
     49 
     50     def run_once(self, program):
     51         program = os.path.join(self.srcdir, program)
     52         self.events = self.events + (self.pw_event,)
     53         self.facts = perf_measurement.GatherPerfStats(program,
     54                 ','.join(self.events))
     55 
     56     def postprocess_iteration(self):
     57         results = {}
     58         if ('iTLB-misses' in self.events):
     59             pw_cycles_per_miss = [x[self.pw_event] * 1.0 / x['iTLB-misses']
     60                                   for x in self.facts]
     61             results['pw-cycles-per-miss'] = numpy.average(pw_cycles_per_miss)
     62         if ('cycles' in self.events):
     63             pw_cycle_percent = [x[self.pw_event] * 100.0 / x['cycles']
     64                                 for x in self.facts]
     65             results['pw-cycle-percent'] = numpy.average(pw_cycle_percent)
     66         self.write_perf_keyval(results)
     67