From a3335d7d2d7b9982afbecbfc87e3fb36ba506fa1 Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 30 Oct 2019 15:51:00 +0100 Subject: [PATCH 1/6] add numpy test --- cscs-checks/apps/python/src/np_test.py | 68 ++++++++++++++++++++++++++ cscs-checks/apps/python/test_numpy.py | 53 ++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 cscs-checks/apps/python/src/np_test.py create mode 100644 cscs-checks/apps/python/test_numpy.py diff --git a/cscs-checks/apps/python/src/np_test.py b/cscs-checks/apps/python/src/np_test.py new file mode 100644 index 0000000000..dd046dcbf0 --- /dev/null +++ b/cscs-checks/apps/python/src/np_test.py @@ -0,0 +1,68 @@ +import numpy as np +from time import time + + +print('Numpy version:', np.__version__) + +# Let's take the randomness out of random numbers (for reproducibility) +np.random.seed(0) + +size = 4096 +A, B = np.random.random((size, size)), np.random.random((size, size)) +C, D = np.random.random((size * 128,)), np.random.random((size * 128,)) +E = np.random.random((int(size / 2), int(size / 4))) +F = np.random.random((int(size / 2), int(size / 2))) +F = np.dot(F, F.T) +G = np.random.random((int(size / 2), int(size / 2))) +I = (F + F.T) / 2. + +# Matrix multiplication +N = 20 +t = time() +for i in range(N): + np.dot(A, B) + +delta = time() - t +print('Dotted two %dx%d matrices in %0.2f s.' % (size, size, delta / N)) +del A, B + +# Singular Value Decomposition (SVD) +N = 3 +t = time() +for i in range(N): + np.linalg.svd(E, full_matrices=False) + +delta = time() - t +print("SVD of a %dx%d matrix in %0.2f s." % (size / 2, size / 4, delta / N)) +del E + +# Cholesky Decomposition +N = 3 +t = time() +for i in range(N): + np.linalg.cholesky(F) + +delta = time() - t +print("Cholesky decomposition of a %dx%d matrix in %0.2f s." % (size / 2, + size / 2, + delta / N)) + +# Eigendecomposition +t = time() +for i in range(N): + np.linalg.eig(G) + +delta = time() - t +print("Eigendecomposition of a %dx%d matrix in %0.2f s." % (size / 2, + size / 2, + delta / N)) + +# Matrix Inversion +t = time() +for i in range(N): + np.linalg.inv(I) + +delta = time() - t +print("Inversion of a %dx%d matrix in %0.2f s." % (size / 2, + size / 2, + delta / N)) diff --git a/cscs-checks/apps/python/test_numpy.py b/cscs-checks/apps/python/test_numpy.py new file mode 100644 index 0000000000..a8ef7e64b6 --- /dev/null +++ b/cscs-checks/apps/python/test_numpy.py @@ -0,0 +1,53 @@ +import reframe as rfm +import reframe.utility.sanity as sn + + +@rfm.required_version('>=2.16') +@rfm.simple_test +class NumpyTest(rfm.RunOnlyRegressionTest): + def __init__(self): + self.descr = 'Test a few common numpy operations' + self.valid_systems = ['dom:gpu'] + self.valid_prog_environs = ['PrgEnv-gnu'] + self.modules = ['numpy/1.17.2-CrayGNU-19.10'] + self.reference = { + 'dom:gpu': { + 'dot': (0.66, None, 0.05, 'seconds'), + 'svd': (0.48, None, 0.05, 'seconds'), + 'cholesky': (0.14, None, 0.05, 'seconds'), + 'eigendec': (4.66, None, 0.05, 'seconds'), + 'inv': (0.26, None, 0.05, 'seconds'), + }, + } + self.perf_patterns = { + 'dot': sn.extractsingle( + r'^Dotted two 4096x4096 matrices in\s+(?P\S+)\s+s', + self.stdout, 'dot', float), + 'svd': sn.extractsingle( + r'^SVD of a 2048x1024 matrix in\s+(?P\S+)\s+s', + self.stdout, 'svd', float), + 'cholesky': sn.extractsingle( + r'^Cholesky decomposition of a 2048x2048 matrix in' + r'\s+(?P\S+)\s+s', + self.stdout, 'cholesky', float), + 'eigendec': sn.extractsingle( + r'^Cholesky decomposition of a 2048x2048 matrix in' + r'\s+(?P\S+)\s+s', + self.stdout, 'eigendec', float), + 'inv': sn.extractsingle( + r'^Inversion of a 2048x2048 matrix in\s+(?P\S+)\s+s', + self.stdout, 'inv', float) + } + + np_version = sn.extractsingle(r'Numpy version:\s+(?P\S+)', + self.stdout, 'ver', str) + self.sanity_patterns = sn.assert_eq(np_version, '1.17.2') + self.variables = { + 'OMP_NUM_THREADS': '$SLURM_CPUS_PER_TASK', + } + self.executable = 'python' + self.executable_opts = ['np_test.py'] + self.num_tasks_per_node = 1 + self.num_cpus_per_task = 12 + self.tags = {'production'} + self.maintainers = ['RS', 'TR'] From 73eea1d17eec40679c8d351ad2ce924346f03ef2 Mon Sep 17 00:00:00 2001 From: rafael Date: Thu, 28 Nov 2019 11:47:07 +0100 Subject: [PATCH 2/6] add mc support --- cscs-checks/apps/python/test_numpy.py | 59 +++++++++++++++++++++------ 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/cscs-checks/apps/python/test_numpy.py b/cscs-checks/apps/python/test_numpy.py index a8ef7e64b6..1b4608757b 100644 --- a/cscs-checks/apps/python/test_numpy.py +++ b/cscs-checks/apps/python/test_numpy.py @@ -2,21 +2,39 @@ import reframe.utility.sanity as sn -@rfm.required_version('>=2.16') -@rfm.simple_test -class NumpyTest(rfm.RunOnlyRegressionTest): +class NumpyBaseTest(rfm.RunOnlyRegressionTest): def __init__(self): - self.descr = 'Test a few common numpy operations' - self.valid_systems = ['dom:gpu'] + self.descr = 'Test a few typical numpy operations' self.valid_prog_environs = ['PrgEnv-gnu'] self.modules = ['numpy/1.17.2-CrayGNU-19.10'] self.reference = { + 'daint:gpu': { + 'dot': (0.4, None, 0.05, 'seconds'), + 'svd': (0.37, None, 0.05, 'seconds'), + 'cholesky': (0.12, None, 0.05, 'seconds'), + 'eigendec': (0.12, None, 0.05, 'seconds'), + 'inv': (0.21, None, 0.05, 'seconds'), + }, + 'daint:mc': { + 'dot': (0.3, None, 0.05, 'seconds'), + 'svd': (0.35, None, 0.05, 'seconds'), + 'cholesky': (0.1, None, 0.05, 'seconds'), + 'eigendec': (0.1, None, 0.05, 'seconds'), + 'inv': (0.16, None, 0.05, 'seconds'), + }, 'dom:gpu': { - 'dot': (0.66, None, 0.05, 'seconds'), - 'svd': (0.48, None, 0.05, 'seconds'), - 'cholesky': (0.14, None, 0.05, 'seconds'), - 'eigendec': (4.66, None, 0.05, 'seconds'), - 'inv': (0.26, None, 0.05, 'seconds'), + 'dot': (0.4, None, 0.05, 'seconds'), + 'svd': (0.37, None, 0.05, 'seconds'), + 'cholesky': (0.12, None, 0.05, 'seconds'), + 'eigendec': (0.12, None, 0.05, 'seconds'), + 'inv': (0.21, None, 0.05, 'seconds'), + }, + 'dom:mc': { + 'dot': (0.3, None, 0.05, 'seconds'), + 'svd': (0.35, None, 0.05, 'seconds'), + 'cholesky': (0.1, None, 0.05, 'seconds'), + 'eigendec': (0.1, None, 0.05, 'seconds'), + 'inv': (0.16, None, 0.05, 'seconds'), }, } self.perf_patterns = { @@ -38,7 +56,6 @@ def __init__(self): r'^Inversion of a 2048x2048 matrix in\s+(?P\S+)\s+s', self.stdout, 'inv', float) } - np_version = sn.extractsingle(r'Numpy version:\s+(?P\S+)', self.stdout, 'ver', str) self.sanity_patterns = sn.assert_eq(np_version, '1.17.2') @@ -48,6 +65,24 @@ def __init__(self): self.executable = 'python' self.executable_opts = ['np_test.py'] self.num_tasks_per_node = 1 - self.num_cpus_per_task = 12 + self.use_multithreading = False self.tags = {'production'} self.maintainers = ['RS', 'TR'] + + +@rfm.required_version('>=2.16') +@rfm.simple_test +class NumpyHaswellTest(NumpyBaseTest): + def __init__(self): + super().__init__() + self.valid_systems = ['daint:gpu', 'dom:gpu'] + self.num_cpus_per_task = 12 + + +@rfm.required_version('>=2.16') +@rfm.simple_test +class NumpyBroadwellTest(NumpyBaseTest): + def __init__(self): + super().__init__() + self.valid_systems = ['daint:mc', 'dom:mc'] + self.num_cpus_per_task = 36 From a024ba2897e6585e903026cc0c636c561993c688 Mon Sep 17 00:00:00 2001 From: rafael Date: Thu, 28 Nov 2019 11:57:05 +0100 Subject: [PATCH 3/6] rename test --- cscs-checks/apps/python/{test_numpy.py => numpy_check.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cscs-checks/apps/python/{test_numpy.py => numpy_check.py} (100%) diff --git a/cscs-checks/apps/python/test_numpy.py b/cscs-checks/apps/python/numpy_check.py similarity index 100% rename from cscs-checks/apps/python/test_numpy.py rename to cscs-checks/apps/python/numpy_check.py From adcb968b8a88d9b52ecbda4e4d1ead294bb560b3 Mon Sep 17 00:00:00 2001 From: rafael Date: Thu, 28 Nov 2019 12:09:06 +0100 Subject: [PATCH 4/6] rename source --- cscs-checks/apps/python/numpy_check.py | 2 +- cscs-checks/apps/python/src/{np_test.py => np_ops.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename cscs-checks/apps/python/src/{np_test.py => np_ops.py} (100%) diff --git a/cscs-checks/apps/python/numpy_check.py b/cscs-checks/apps/python/numpy_check.py index 1b4608757b..b5d68f528a 100644 --- a/cscs-checks/apps/python/numpy_check.py +++ b/cscs-checks/apps/python/numpy_check.py @@ -63,7 +63,7 @@ def __init__(self): 'OMP_NUM_THREADS': '$SLURM_CPUS_PER_TASK', } self.executable = 'python' - self.executable_opts = ['np_test.py'] + self.executable_opts = ['np_ops.py'] self.num_tasks_per_node = 1 self.use_multithreading = False self.tags = {'production'} diff --git a/cscs-checks/apps/python/src/np_test.py b/cscs-checks/apps/python/src/np_ops.py similarity index 100% rename from cscs-checks/apps/python/src/np_test.py rename to cscs-checks/apps/python/src/np_ops.py From 1698c14b1131ad3e1ca6ca836fecc3ac41e6da49 Mon Sep 17 00:00:00 2001 From: rafael Date: Fri, 29 Nov 2019 11:01:20 +0100 Subject: [PATCH 5/6] bug fix --- cscs-checks/apps/python/numpy_check.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cscs-checks/apps/python/numpy_check.py b/cscs-checks/apps/python/numpy_check.py index b5d68f528a..6b9a248106 100644 --- a/cscs-checks/apps/python/numpy_check.py +++ b/cscs-checks/apps/python/numpy_check.py @@ -12,28 +12,28 @@ def __init__(self): 'dot': (0.4, None, 0.05, 'seconds'), 'svd': (0.37, None, 0.05, 'seconds'), 'cholesky': (0.12, None, 0.05, 'seconds'), - 'eigendec': (0.12, None, 0.05, 'seconds'), + 'eigendec': (3.5, None, 0.05, 'seconds'), 'inv': (0.21, None, 0.05, 'seconds'), }, 'daint:mc': { 'dot': (0.3, None, 0.05, 'seconds'), 'svd': (0.35, None, 0.05, 'seconds'), 'cholesky': (0.1, None, 0.05, 'seconds'), - 'eigendec': (0.1, None, 0.05, 'seconds'), + 'eigendec': (4.14, None, 0.05, 'seconds'), 'inv': (0.16, None, 0.05, 'seconds'), }, 'dom:gpu': { 'dot': (0.4, None, 0.05, 'seconds'), 'svd': (0.37, None, 0.05, 'seconds'), 'cholesky': (0.12, None, 0.05, 'seconds'), - 'eigendec': (0.12, None, 0.05, 'seconds'), + 'eigendec': (3.5, None, 0.05, 'seconds'), 'inv': (0.21, None, 0.05, 'seconds'), }, 'dom:mc': { 'dot': (0.3, None, 0.05, 'seconds'), 'svd': (0.35, None, 0.05, 'seconds'), 'cholesky': (0.1, None, 0.05, 'seconds'), - 'eigendec': (0.1, None, 0.05, 'seconds'), + 'eigendec': (4.14, None, 0.05, 'seconds'), 'inv': (0.16, None, 0.05, 'seconds'), }, } @@ -49,7 +49,7 @@ def __init__(self): r'\s+(?P\S+)\s+s', self.stdout, 'cholesky', float), 'eigendec': sn.extractsingle( - r'^Cholesky decomposition of a 2048x2048 matrix in' + r'^Eigendecomposition of a 2048x2048 matrix in' r'\s+(?P\S+)\s+s', self.stdout, 'eigendec', float), 'inv': sn.extractsingle( From 5b9b0ea8a3a3045901eddaafd3e422daf3ba77fe Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 2 Dec 2019 09:39:31 +0100 Subject: [PATCH 6/6] remove version check --- cscs-checks/apps/python/numpy_check.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cscs-checks/apps/python/numpy_check.py b/cscs-checks/apps/python/numpy_check.py index 6b9a248106..2185c465ca 100644 --- a/cscs-checks/apps/python/numpy_check.py +++ b/cscs-checks/apps/python/numpy_check.py @@ -56,9 +56,8 @@ def __init__(self): r'^Inversion of a 2048x2048 matrix in\s+(?P\S+)\s+s', self.stdout, 'inv', float) } - np_version = sn.extractsingle(r'Numpy version:\s+(?P\S+)', - self.stdout, 'ver', str) - self.sanity_patterns = sn.assert_eq(np_version, '1.17.2') + self.sanity_patterns = sn.assert_found(r'Numpy version:\s+\S+', + self.stdout) self.variables = { 'OMP_NUM_THREADS': '$SLURM_CPUS_PER_TASK', }