@@ -398,7 +398,7 @@ def generate_cmake_config(self, test, for_ctest=False):
398
398
return result
399
399
400
400
###############################################################################
401
- def get_taskset_range (self , test , for_compile = True ):
401
+ def get_taskset_resources (self , test , for_compile = True ):
402
402
###############################################################################
403
403
res_name = "compile_res_count" if for_compile else "testing_res_count"
404
404
@@ -419,13 +419,11 @@ def get_taskset_range(self, test, for_compile=True):
419
419
420
420
expect (offset < len (affinity_cp ),
421
421
f"Offset { offset } out of bounds (max={ len (affinity_cp )} ) for test { test } \n affinity_cp: { affinity_cp } " )
422
- start = affinity_cp [offset ]
423
- end = start
424
- for i in range (1 , getattr (test , res_name )):
425
- expect (affinity_cp [offset + i ] == start + i , f"Could not get contiguous range for test { test } " )
426
- end = affinity_cp [offset + i ]
422
+ resources = []
423
+ for i in range (0 , getattr (test , res_name )):
424
+ resources .append (affinity_cp [offset + i ])
427
425
428
- return start , end
426
+ return resources
429
427
430
428
###############################################################################
431
429
def create_ctest_resource_file (self , test , build_dir ):
@@ -438,7 +436,7 @@ def create_ctest_resource_file(self, test, build_dir):
438
436
# res group is where we usually bind an individual MPI rank.
439
437
# The id of the res groups on is offset so that it is unique across all builds
440
438
441
- start , end = self .get_taskset_range (test , for_compile = False )
439
+ resources = self .get_taskset_resources (test , for_compile = False )
442
440
443
441
data = {}
444
442
@@ -448,7 +446,7 @@ def create_ctest_resource_file(self, test, build_dir):
448
446
# We add leading zeroes to ensure that ids will sort correctly
449
447
# both alphabetically and numerically
450
448
devices = []
451
- for res_id in range ( start , end + 1 ) :
449
+ for res_id in resources :
452
450
devices .append ({"id" :f"{ res_id :05d} " })
453
451
454
452
# Add resource groups
@@ -457,7 +455,7 @@ def create_ctest_resource_file(self, test, build_dir):
457
455
with (build_dir / "ctest_resource_file.json" ).open ("w" , encoding = "utf-8" ) as outfile :
458
456
json .dump (data ,outfile ,indent = 2 )
459
457
460
- return ( end - start ) + 1
458
+ return len ( resources )
461
459
462
460
###############################################################################
463
461
def generate_ctest_config (self , cmake_config , extra_configs , test ):
@@ -498,11 +496,11 @@ def generate_ctest_config(self, cmake_config, extra_configs, test):
498
496
499
497
# Ctest can only competently manage test pinning across a single instance of ctest. For
500
498
# multiple concurrent instances of ctest, we have to help it. It's OK to use the compile_res_count
501
- # taskset range even though the ctest script is also running the tests
499
+ # taskset resources even though the ctest script is also running the tests
502
500
if self ._parallel :
503
- start , end = self .get_taskset_range (test )
501
+ resources = self .get_taskset_resources (test )
504
502
result = result .replace ("'" , r"'\''" ) # handle nested quoting
505
- result = f"taskset -c { start } - { end } sh -c '{ result } '"
503
+ result = f"taskset -c { ',' . join ([ str ( r ) for r in resources ]) } sh -c '{ result } '"
506
504
507
505
return result
508
506
@@ -539,8 +537,8 @@ def generate_baselines(self, test):
539
537
540
538
cmd = f"make -j{ test .compile_res_count } "
541
539
if self ._parallel :
542
- start , end = self .get_taskset_range (test )
543
- cmd = f"taskset -c { start } - { end } sh -c '{ cmd } '"
540
+ resources = self .get_taskset_resources (test )
541
+ cmd = f"taskset -c { ',' . join ([ str ( r ) for r in resources ]) } sh -c '{ cmd } '"
544
542
545
543
stat , _ , err = run_cmd (cmd , from_dir = test_dir , verbose = True )
546
544
0 commit comments