[Piglit] [PATCH 2/3] framework: allow specifying the number of jobs for concurrency

Dylan Baker dylan at pnwbakers.com
Wed May 30 20:21:20 UTC 2018


Quoting Marek Olšák (2018-05-30 13:04:47)
> From: Nicolai Hähnle <nicolai.haehnle at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20180530/c455aed6/attachment-0001.sig>


More information about the Piglit mailing list