Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 177 additions & 0 deletions cscs-checks/prgenv/affinity_check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
import reframe as rfm
import reframe.utility.sanity as sn


class AffinityTestBase(rfm.RegressionTest):
def __init__(self, variant):
super().__init__()
self.valid_systems = ['daint:gpu', 'daint:mc',
'dom:gpu', 'dom:mc']
self.valid_prog_environs = ['PrgEnv-gnu']
self.build_system = 'Make'
self.build_system.options = ['--directory=affinity', 'MPI=1']
# The github URL can not be specifid as `self.sourcedir` as that
# would prevent the src folder from being copied to stage which is
# necessary since these tests need files from it.
self.prebuild_cmd = ['git clone https://github.com/vkarak/affinity']
self.executable = 'affinity/affinity'
self.variant = variant
self.maintainers = ['RS', 'VK']
self.tags = {'production', 'scs', 'maintenance'}

def setup(self, partition, environ, **job_opts):

def parse_cpus(x):
return sorted([int(xi) for xi in x.split()])

re_aff_cores = r'CPU affinity: \[\s+(?P<cpus>[\d+\s+]+)\]'
self.aff_cores = sn.extractall(
re_aff_cores, self.stdout, 'cpus', parse_cpus)
ref_key = 'ref_' + partition.fullname
self.ref_cores = sn.extractall(
re_aff_cores, self.cases[self.variant][ref_key],
'cpus', parse_cpus)
re_aff_thrds = r'^Tag:[^\n\r]*Thread:\s+(?P<thread>\d+)'
self.aff_thrds = sn.extractall(re_aff_thrds, self.stdout, 'thread',
int)
self.ref_thrds = sn.extractall(
re_aff_thrds, self.cases[self.variant][ref_key],
'thread', int)
re_aff_ranks = r'^Tag:[^\n\r]*Rank:\s+(?P<rank>\d+)[\s+\S+]'
self.aff_ranks = sn.extractall(re_aff_ranks, self.stdout, 'rank', int)
self.ref_ranks = sn.extractall(
re_aff_ranks, self.cases[self.variant][ref_key],
'rank', int)

self.use_multithreading = self.cases[self.variant]['multithreading']

# Ranks and threads can be extracted into lists in order to compare
# them since the affinity programm prints them in ascending order.
self.sanity_patterns = sn.all([
sn.assert_eq(self.aff_thrds, self.ref_thrds),
sn.assert_eq(self.aff_ranks, self.ref_ranks),
sn.assert_eq(self.aff_cores, self.ref_cores)])

super().setup(partition, environ, **job_opts)


@rfm.parameterized_test(['omp_bind_threads'],
['omp_bind_threads_nomultithread'],
['omp_bind_cores'])
class AffinityOpenMPTest(AffinityTestBase):
def __init__(self, variant):
super().__init__(variant)
self.descr = 'Checking the cpu affinity for OMP threads.'
self.cases = {
'omp_bind_threads': {
'ref_daint:gpu': 'gpu_omp_bind_threads.txt',
'ref_dom:gpu': 'gpu_omp_bind_threads.txt',
'ref_daint:mc': 'mc_omp_bind_threads.txt',
'ref_dom:mc': 'mc_omp_bind_threads.txt',
'num_cpus_per_task:gpu': 24,
'num_cpus_per_task:mc': 72,
'ntasks_per_core': 2,
'multithreading': None,
'OMP_PLACES': 'threads',
},
'omp_bind_threads_nomultithread': {
'ref_daint:gpu': 'gpu_omp_bind_threads_nomultithread.txt',
'ref_dom:gpu': 'gpu_omp_bind_threads_nomultithread.txt',
'ref_daint:mc': 'mc_omp_bind_threads_nomultithread.txt',
'ref_dom:mc': 'mc_omp_bind_threads_nomultithread.txt',
'num_cpus_per_task:gpu': 12,
'num_cpus_per_task:mc': 36,
'ntasks_per_core': None,
# When `--hint=nomultithread` is not explicitly expecified only
# half of the physical cores are used.
'multithreading': False,
'OMP_PLACES': 'threads',
},
'omp_bind_cores': {
'ref_daint:gpu': 'gpu_omp_bind_cores.txt',
'ref_dom:gpu': 'gpu_omp_bind_cores.txt',
'ref_daint:mc': 'mc_omp_bind_cores.txt',
'ref_dom:mc': 'mc_omp_bind_cores.txt',
'num_cpus_per_task:gpu': 12,
'num_cpus_per_task:mc': 36,
'ntasks_per_core': 1,
'multithreading': None,
'OMP_PLACES': 'cores',
},
}
self.variant = variant

def setup(self, partition, environ, **job_opts):
self.num_cpus_per_task = (
self.cases[self.variant]['num_cpus_per_task:%s' % partition.name])
if self.cases[self.variant]['ntasks_per_core']:
self.num_tasks_per_core = (
self.cases[self.variant]['ntasks_per_core'])

self.num_tasks = 1
self.variables = {
'OMP_NUM_THREADS': str(self.num_cpus_per_task),
'OMP_PLACES': self.cases[self.variant]['OMP_PLACES']
# OMP_PROC_BIND is set to TRUE if OMP_PLACES is defined.
# Both OMP_PROC_BIND values CLOSE and SPREAD give the same
# result as OMP_PROC_BIND=TRUE when all cores are requested.
}
super().setup(partition, environ, **job_opts)


@rfm.parameterized_test(['alternate_socket_filling'],
['consecutive_socket_filling'],
['single_task_per_socket_omp'],
['single_task_per_socket_omp_nomultithread'])
class SocketDistributionTest(AffinityTestBase):
def __init__(self, variant):
super().__init__(variant)
self.descr = 'Checking distribution of ranks and threads over sockets.'
self.valid_systems = ['daint:mc', 'dom:mc']
self.cases = {
'alternate_socket_filling': {
'ref_daint:mc': 'alternate_socket_filling.txt',
'ref_dom:mc': 'alternate_socket_filling.txt',
'num_tasks': 36,
'num_cpus_per_task': 1,
'num_tasks_per_socket': 18,
'multithreading': False,
'cpu-bind': None,
},
'consecutive_socket_filling': {
'ref_daint:mc': 'consecutive_socket_filling.txt',
'ref_dom:mc': 'consecutive_socket_filling.txt',
'num_tasks': 36,
'num_cpus_per_task': 1,
'num_tasks_per_socket': None,
'multithreading': False,
'cpu-bind': 'rank',
},
'single_task_per_socket_omp': {
'ref_daint:mc': 'single_task_per_socket_omp.txt',
'ref_dom:mc': 'single_task_per_socket_omp.txt',
'num_tasks': 2,
'num_cpus_per_task': 18,
'num_tasks_per_socket': 1,
'multithreading': False,
'cpu-bind': None,
},
'single_task_per_socket_omp_nomultithread': {
'ref_daint:mc': 'single_task_per_socket_omp_multithread.txt',
'ref_dom:mc': 'single_task_per_socket_omp_multithread.txt',
'num_tasks': 2,
'num_cpus_per_task': 36,
'num_tasks_per_socket': 1,
'multithreading': True,
'cpu-bind': None,
},
}
self.num_tasks = self.cases[variant]['num_tasks']
self.num_cpus_per_task = self.cases[variant]['num_cpus_per_task']
self.num_tasks_per_socket = self.cases[variant]['num_tasks_per_socket']

def setup(self, partition, environ, **job_opts):
super().setup(partition, environ, **job_opts)
if self.cases[self.variant]['cpu-bind']:
self.job.launcher.options = ['--cpu-bind=%s' %
self.cases[self.variant]['cpu-bind']]
72 changes: 72 additions & 0 deletions cscs-checks/prgenv/src/alternate_socket_filling.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
Tag: affinity/affinity, Hostname: nid00404, Rank: 0, Thread: 0
CPU affinity: [ 0]
Tag: affinity/affinity, Hostname: nid00404, Rank: 1, Thread: 0
CPU affinity: [ 18]
Tag: affinity/affinity, Hostname: nid00404, Rank: 2, Thread: 0
CPU affinity: [ 1]
Tag: affinity/affinity, Hostname: nid00404, Rank: 3, Thread: 0
CPU affinity: [ 19]
Tag: affinity/affinity, Hostname: nid00404, Rank: 4, Thread: 0
CPU affinity: [ 2]
Tag: affinity/affinity, Hostname: nid00404, Rank: 5, Thread: 0
CPU affinity: [ 20]
Tag: affinity/affinity, Hostname: nid00404, Rank: 6, Thread: 0
CPU affinity: [ 3]
Tag: affinity/affinity, Hostname: nid00404, Rank: 7, Thread: 0
CPU affinity: [ 21]
Tag: affinity/affinity, Hostname: nid00404, Rank: 8, Thread: 0
CPU affinity: [ 4]
Tag: affinity/affinity, Hostname: nid00404, Rank: 9, Thread: 0
CPU affinity: [ 22]
Tag: affinity/affinity, Hostname: nid00404, Rank: 10, Thread: 0
CPU affinity: [ 5]
Tag: affinity/affinity, Hostname: nid00404, Rank: 11, Thread: 0
CPU affinity: [ 23]
Tag: affinity/affinity, Hostname: nid00404, Rank: 12, Thread: 0
CPU affinity: [ 6]
Tag: affinity/affinity, Hostname: nid00404, Rank: 13, Thread: 0
CPU affinity: [ 24]
Tag: affinity/affinity, Hostname: nid00404, Rank: 14, Thread: 0
CPU affinity: [ 7]
Tag: affinity/affinity, Hostname: nid00404, Rank: 15, Thread: 0
CPU affinity: [ 25]
Tag: affinity/affinity, Hostname: nid00404, Rank: 16, Thread: 0
CPU affinity: [ 8]
Tag: affinity/affinity, Hostname: nid00404, Rank: 17, Thread: 0
CPU affinity: [ 26]
Tag: affinity/affinity, Hostname: nid00404, Rank: 18, Thread: 0
CPU affinity: [ 9]
Tag: affinity/affinity, Hostname: nid00404, Rank: 19, Thread: 0
CPU affinity: [ 27]
Tag: affinity/affinity, Hostname: nid00404, Rank: 20, Thread: 0
CPU affinity: [ 10]
Tag: affinity/affinity, Hostname: nid00404, Rank: 21, Thread: 0
CPU affinity: [ 28]
Tag: affinity/affinity, Hostname: nid00404, Rank: 22, Thread: 0
CPU affinity: [ 11]
Tag: affinity/affinity, Hostname: nid00404, Rank: 23, Thread: 0
CPU affinity: [ 29]
Tag: affinity/affinity, Hostname: nid00404, Rank: 24, Thread: 0
CPU affinity: [ 12]
Tag: affinity/affinity, Hostname: nid00404, Rank: 25, Thread: 0
CPU affinity: [ 30]
Tag: affinity/affinity, Hostname: nid00404, Rank: 26, Thread: 0
CPU affinity: [ 13]
Tag: affinity/affinity, Hostname: nid00404, Rank: 27, Thread: 0
CPU affinity: [ 31]
Tag: affinity/affinity, Hostname: nid00404, Rank: 28, Thread: 0
CPU affinity: [ 14]
Tag: affinity/affinity, Hostname: nid00404, Rank: 29, Thread: 0
CPU affinity: [ 32]
Tag: affinity/affinity, Hostname: nid00404, Rank: 30, Thread: 0
CPU affinity: [ 15]
Tag: affinity/affinity, Hostname: nid00404, Rank: 31, Thread: 0
CPU affinity: [ 33]
Tag: affinity/affinity, Hostname: nid00404, Rank: 32, Thread: 0
CPU affinity: [ 16]
Tag: affinity/affinity, Hostname: nid00404, Rank: 33, Thread: 0
CPU affinity: [ 34]
Tag: affinity/affinity, Hostname: nid00404, Rank: 34, Thread: 0
CPU affinity: [ 17]
Tag: affinity/affinity, Hostname: nid00404, Rank: 35, Thread: 0
CPU affinity: [ 35]
72 changes: 72 additions & 0 deletions cscs-checks/prgenv/src/consecutive_socket_filling.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
Tag: affinity/affinity, Hostname: nid00404, Rank: 0, Thread: 0
CPU affinity: [ 0]
Tag: affinity/affinity, Hostname: nid00404, Rank: 1, Thread: 0
CPU affinity: [ 1]
Tag: affinity/affinity, Hostname: nid00404, Rank: 2, Thread: 0
CPU affinity: [ 2]
Tag: affinity/affinity, Hostname: nid00404, Rank: 3, Thread: 0
CPU affinity: [ 3]
Tag: affinity/affinity, Hostname: nid00404, Rank: 4, Thread: 0
CPU affinity: [ 4]
Tag: affinity/affinity, Hostname: nid00404, Rank: 5, Thread: 0
CPU affinity: [ 5]
Tag: affinity/affinity, Hostname: nid00404, Rank: 6, Thread: 0
CPU affinity: [ 6]
Tag: affinity/affinity, Hostname: nid00404, Rank: 7, Thread: 0
CPU affinity: [ 7]
Tag: affinity/affinity, Hostname: nid00404, Rank: 8, Thread: 0
CPU affinity: [ 8]
Tag: affinity/affinity, Hostname: nid00404, Rank: 9, Thread: 0
CPU affinity: [ 9]
Tag: affinity/affinity, Hostname: nid00404, Rank: 10, Thread: 0
CPU affinity: [ 10]
Tag: affinity/affinity, Hostname: nid00404, Rank: 11, Thread: 0
CPU affinity: [ 11]
Tag: affinity/affinity, Hostname: nid00404, Rank: 12, Thread: 0
CPU affinity: [ 12]
Tag: affinity/affinity, Hostname: nid00404, Rank: 13, Thread: 0
CPU affinity: [ 13]
Tag: affinity/affinity, Hostname: nid00404, Rank: 14, Thread: 0
CPU affinity: [ 14]
Tag: affinity/affinity, Hostname: nid00404, Rank: 15, Thread: 0
CPU affinity: [ 15]
Tag: affinity/affinity, Hostname: nid00404, Rank: 16, Thread: 0
CPU affinity: [ 16]
Tag: affinity/affinity, Hostname: nid00404, Rank: 17, Thread: 0
CPU affinity: [ 17]
Tag: affinity/affinity, Hostname: nid00404, Rank: 18, Thread: 0
CPU affinity: [ 18]
Tag: affinity/affinity, Hostname: nid00404, Rank: 19, Thread: 0
CPU affinity: [ 19]
Tag: affinity/affinity, Hostname: nid00404, Rank: 20, Thread: 0
CPU affinity: [ 20]
Tag: affinity/affinity, Hostname: nid00404, Rank: 21, Thread: 0
CPU affinity: [ 21]
Tag: affinity/affinity, Hostname: nid00404, Rank: 22, Thread: 0
CPU affinity: [ 22]
Tag: affinity/affinity, Hostname: nid00404, Rank: 23, Thread: 0
CPU affinity: [ 23]
Tag: affinity/affinity, Hostname: nid00404, Rank: 24, Thread: 0
CPU affinity: [ 24]
Tag: affinity/affinity, Hostname: nid00404, Rank: 25, Thread: 0
CPU affinity: [ 25]
Tag: affinity/affinity, Hostname: nid00404, Rank: 26, Thread: 0
CPU affinity: [ 26]
Tag: affinity/affinity, Hostname: nid00404, Rank: 27, Thread: 0
CPU affinity: [ 27]
Tag: affinity/affinity, Hostname: nid00404, Rank: 28, Thread: 0
CPU affinity: [ 28]
Tag: affinity/affinity, Hostname: nid00404, Rank: 29, Thread: 0
CPU affinity: [ 29]
Tag: affinity/affinity, Hostname: nid00404, Rank: 30, Thread: 0
CPU affinity: [ 30]
Tag: affinity/affinity, Hostname: nid00404, Rank: 31, Thread: 0
CPU affinity: [ 31]
Tag: affinity/affinity, Hostname: nid00404, Rank: 32, Thread: 0
CPU affinity: [ 32]
Tag: affinity/affinity, Hostname: nid00404, Rank: 33, Thread: 0
CPU affinity: [ 33]
Tag: affinity/affinity, Hostname: nid00404, Rank: 34, Thread: 0
CPU affinity: [ 34]
Tag: affinity/affinity, Hostname: nid00404, Rank: 35, Thread: 0
CPU affinity: [ 35]
24 changes: 24 additions & 0 deletions cscs-checks/prgenv/src/gpu_omp_bind_cores.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 0
CPU affinity: [ 0 12]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 1
CPU affinity: [ 0 12]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 2
CPU affinity: [ 1 13]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 3
CPU affinity: [ 1 13]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 4
CPU affinity: [ 2 14]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 5
CPU affinity: [ 2 14]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 6
CPU affinity: [ 3 15]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 7
CPU affinity: [ 3 15]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 8
CPU affinity: [ 4 16]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 9
CPU affinity: [ 4 16]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 10
CPU affinity: [ 5 17]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 11
CPU affinity: [ 5 17]
48 changes: 48 additions & 0 deletions cscs-checks/prgenv/src/gpu_omp_bind_threads.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 0
CPU affinity: [ 0]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 1
CPU affinity: [ 1]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 2
CPU affinity: [ 2]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 3
CPU affinity: [ 3]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 4
CPU affinity: [ 4]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 5
CPU affinity: [ 5]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 6
CPU affinity: [ 6]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 7
CPU affinity: [ 7]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 8
CPU affinity: [ 8]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 9
CPU affinity: [ 9]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 10
CPU affinity: [ 10]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 11
CPU affinity: [ 11]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 12
CPU affinity: [ 12]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 13
CPU affinity: [ 13]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 14
CPU affinity: [ 14]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 15
CPU affinity: [ 15]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 16
CPU affinity: [ 16]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 17
CPU affinity: [ 17]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 18
CPU affinity: [ 18]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 19
CPU affinity: [ 19]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 20
CPU affinity: [ 20]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 21
CPU affinity: [ 21]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 22
CPU affinity: [ 22]
Tag: affinity/affinity, Hostname: nid00001, Rank: 0, Thread: 23
CPU affinity: [ 23]
Loading