Quoting Marek Olšák (2018-05-30 13:04:47) > From: Nicolai Hähnle <nicolai.haeh...@amd.com> > > The default remains the same: number of CPUs. But on systems with lots of > cores but comparatively little (V)RAM it can make sense to reduce the > number of jobs to avoid random failures caused by out-of-memory conditions. > --- > framework/options.py | 1 + > framework/profile.py | 7 +++++-- > framework/programs/run.py | 23 +++++++++++++++++++++-- > 3 files changed, 27 insertions(+), 4 deletions(-) > > diff --git a/framework/options.py b/framework/options.py > index 211159a45..b6ff2b406 100644 > --- a/framework/options.py > +++ b/framework/options.py > @@ -51,20 +51,21 @@ class _Options(object): # pylint: > disable=too-many-instance-attributes > env -- environment variables set for each test before run > deqp_mustpass -- True to enable the use of the deqp mustpass list > feature. > """ > > def __init__(self): > self.execute = True > self.valgrind = False > self.sync = False > self.deqp_mustpass = False > self.process_isolation = True > + self.jobs = -1
This should be None by default instead of -1. > > # env is used to set some base environment variables that are not > going > # to change across runs, without sending them to os.environ which is > # fickle and easy to break > self.env = { > 'PIGLIT_SOURCE_DIR': > os.environ.get( > 'PIGLIT_SOURCE_DIR', > os.path.abspath(os.path.join(os.path.dirname(__file__), > '..'))) > diff --git a/framework/profile.py b/framework/profile.py > index ffc91e0a6..cdd0d3057 100644 > --- a/framework/profile.py > +++ b/framework/profile.py > @@ -590,37 +590,38 @@ def load_test_profile(filename, python=None): > filename)) > > try: > return mod.profile > except AttributeError: > raise exceptions.PiglitFatalError( > 'There is no "profile" attribute in module {}.\n' > 'Did you specify the right file?'.format(filename)) > > > -def run(profiles, logger, backend, concurrency): > +def run(profiles, logger, backend, concurrency, jobs=-1): Don't give this a default value, just leave as jobs since it'll always be passed (unless I missed something.) > """Runs all tests using Thread pool. > > When called this method will flatten out self.tests into self.test_list, > then will prepare a logger, and begin executing tests through it's Thread > pools. > > Based on the value of concurrency it will either run all the tests > concurrently, all serially, or first the thread safe tests then the > serial tests. > > Finally it will print a final summary of the tests. > > Arguments: > profiles -- a list of Profile instances. > logger -- a log.LogManager instance. > backend -- a results.Backend derived instance. > + jobs -- maximum number of concurrent jobs. Use os.cpu_count() by > default > """ > chunksize = 1 > > profiles = [(p, p.itertests()) for p in profiles] > log = LogManager(logger, sum(len(p) for p, _ in profiles)) > > # check that after the filters are run there are actually tests to run. > # if not any(l for _, l in profiles): > # raise exceptions.PiglitUserError('no matching tests') > > @@ -663,21 +664,23 @@ def run(profiles, logger, backend, concurrency): > # pool > run_threads(single, profile, test_list[1], > lambda x: not x[1].run_concurrent) > profile.teardown() > > # Multiprocessing.dummy is a wrapper around Threading that provides a > # multiprocessing compatible API > # > # The default value of pool is the number of virtual processor cores > single = multiprocessing.dummy.Pool(1) > - multi = multiprocessing.dummy.Pool() > + if not jobs or jobs < 0: > + jobs = os.cpu_count() > + multi = multiprocessing.dummy.Pool(jobs) If you set processes=None instead of processes=-1 by default we can drop the if statement above, when processes == None, os.cpu_count() is used automatically by Pool class. > > try: > for p in profiles: > run_profile(*p) > > for pool in [single, multi]: > pool.close() > pool.join() > finally: > log.get().summary() > diff --git a/framework/programs/run.py b/framework/programs/run.py > index 14fb764a2..bbc527b55 100644 > --- a/framework/programs/run.py > +++ b/framework/programs/run.py > @@ -201,20 +201,28 @@ def _run_parser(input_): > dest='process_isolation', > action='store', > type=booltype, > default=core.PIGLIT_CONFIG.safe_get( > 'core', 'process isolation', 'true'), > metavar='<bool>', > help='Set this to allow tests to run without process > ' > 'isolation. This allows, but does not require, ' > 'tests to run multiple tests per process. ' > 'This value can also be set in piglit.conf.') > + parser.add_argument('-j', '--jobs', > + dest='jobs', > + action='store', > + type=int, > + default=core.PIGLIT_CONFIG.safe_get( > + 'core', 'jobs', '-1'), None here as well. Dylan
signature.asc
Description: signature
_______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit