Updatepackage/minigmg (#26467)
* MiniGMG, add support for optimised flags + SIMDe implementation of AVX instrinsics * Add .gitlab-ci.yml * NVHPC fast * remove CI * Syntax fix
This commit is contained in:
parent
0b9914e2f5
commit
da31c7e894
21
var/spack/repos/builtin/packages/minigmg/aarch64_time.patch
Normal file
21
var/spack/repos/builtin/packages/minigmg/aarch64_time.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
diff --git a/timer.aarch64.c b/timer.aarch64.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..ca47633
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/timer.aarch64.c
|
||||||
|
@@ -0,0 +1,15 @@
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+// Samuel Williams
|
||||||
|
+// SWWilliams@lbl.gov
|
||||||
|
+// Lawrence Berkeley National Lab
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+#include <stdint.h>
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+uint64_t CycleTime(){
|
||||||
|
+ uint64_t val;
|
||||||
|
+ asm volatile("mrs %0, cntvct_el0" : "=r" (val));
|
||||||
|
+
|
||||||
|
+ return val;
|
||||||
|
+}
|
||||||
|
+
|
14
var/spack/repos/builtin/packages/minigmg/inline_static.patch
Normal file
14
var/spack/repos/builtin/packages/minigmg/inline_static.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
diff --git a/operators.ompif/exchange_boundary.c b/operators.ompif/exchange_boundary.c
|
||||||
|
index 6cb27b2..702a2cb 100644
|
||||||
|
--- a/operators.ompif/exchange_boundary.c
|
||||||
|
+++ b/operators.ompif/exchange_boundary.c
|
||||||
|
@@ -6,7 +6,7 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "../timer.h"
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-inline void DoBufferCopy(domain_type *domain, int level, int grid_id, int buffer){
|
||||||
|
+inline static void DoBufferCopy(domain_type *domain, int level, int grid_id, int buffer){
|
||||||
|
// copy 3D array from read_i,j,k of read[] to write_i,j,k in write[]
|
||||||
|
int dim_i = domain->bufferCopies[level][buffer].dim.i;
|
||||||
|
int dim_j = domain->bufferCopies[level][buffer].dim.j;
|
||||||
|
|
@ -24,17 +24,73 @@ class Minigmg(Package):
|
|||||||
|
|
||||||
version('master', sha256='1c2d27496a881f655f5e849d6a7a132625e535739f82575991c511cc2cf899ac')
|
version('master', sha256='1c2d27496a881f655f5e849d6a7a132625e535739f82575991c511cc2cf899ac')
|
||||||
|
|
||||||
|
variant('vec', default='ompif', description='Which method of vectorisation to use',
|
||||||
|
values=('ompif', 'sse', 'avx', 'simde'), multi=False)
|
||||||
|
|
||||||
|
variant('opt', default=False, description='Enable optimization flags for improved OpenMP')
|
||||||
|
|
||||||
depends_on('mpi')
|
depends_on('mpi')
|
||||||
|
|
||||||
|
# Set up SIMD Everywhere config
|
||||||
|
depends_on('simde', when='vec=simde')
|
||||||
|
patch('simde.patch', when='vec=simde')
|
||||||
|
|
||||||
|
# Patch to add timer for Aarch64 rather than rdtsc
|
||||||
|
patch('aarch64_time.patch', when='target=aarch64:')
|
||||||
|
|
||||||
|
# Replaces inline with inline static, for correct syntax
|
||||||
|
patch('inline_static.patch')
|
||||||
|
|
||||||
phases = ['build', 'install']
|
phases = ['build', 'install']
|
||||||
|
|
||||||
def build(self, spec, prefix):
|
def build(self, spec, prefix):
|
||||||
|
|
||||||
cc = Executable(spec['mpi'].mpicc)
|
cc = Executable(spec['mpi'].mpicc)
|
||||||
cc('-O3', self.compiler.openmp_flag, 'miniGMG.c',
|
|
||||||
'mg.c', 'box.c', 'solver.c', 'operators.ompif.c', 'timer.x86.c',
|
args = []
|
||||||
'-D__MPI', '-D__COLLABORATIVE_THREADING=6',
|
|
||||||
'-D__TEST_MG_CONVERGENCE', '-D__PRINT_NORM', '-D__USE_BICGSTAB',
|
# Default optimisation level
|
||||||
'-o', 'run.miniGMG', '-lm')
|
if spec.satisfies('+opt'):
|
||||||
|
if self.spec.satisfies('%nvhpc'):
|
||||||
|
args.append('-fast')
|
||||||
|
else:
|
||||||
|
args.append('-Ofast')
|
||||||
|
else:
|
||||||
|
args.append('-O3')
|
||||||
|
|
||||||
|
# Add OpenMP flag
|
||||||
|
args += [self.compiler.openmp_flag]
|
||||||
|
|
||||||
|
args += ['miniGMG.c', 'mg.c', 'box.c', 'solver.c']
|
||||||
|
|
||||||
|
# Set the correct operators file - using the vec variant
|
||||||
|
if spec.satisfies('vec=sse'):
|
||||||
|
args += ['operators.sse.c']
|
||||||
|
elif spec.satisfies('vec=avx'):
|
||||||
|
args += ['operators.avx.c']
|
||||||
|
elif spec.satisfies('vec=simde'):
|
||||||
|
args += ['operators.simde.c']
|
||||||
|
else:
|
||||||
|
args += ['operators.ompif.c']
|
||||||
|
|
||||||
|
# Switch out timer file (depends on patch)
|
||||||
|
if spec.satisfies('target=aarch64:'):
|
||||||
|
args += ['timer.aarch64.c']
|
||||||
|
else:
|
||||||
|
args += ['timer.x86.c']
|
||||||
|
|
||||||
|
args += ['-D__MPI']
|
||||||
|
|
||||||
|
if spec.satisfies('+opt'):
|
||||||
|
args += ['-D__PREFETCH_NEXT_PLANE_FROM_DRAM']
|
||||||
|
args += ['-D__FUSION_RESIDUAL_RESTRICTION']
|
||||||
|
else:
|
||||||
|
args += ['-D__COLLABORATIVE_THREADING=6']
|
||||||
|
|
||||||
|
args += ['-D__TEST_MG_CONVERGENCE', '-D__PRINT_NORM', '-D__USE_BICGSTAB']
|
||||||
|
args += ['-o', 'run.miniGMG', '-lm']
|
||||||
|
|
||||||
|
cc(*args)
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
mkdir(prefix.bin)
|
mkdir(prefix.bin)
|
||||||
|
40
var/spack/repos/builtin/packages/minigmg/simde.patch
Normal file
40
var/spack/repos/builtin/packages/minigmg/simde.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
diff --git a/operators.simde.c b/operators.simde.c
|
||||||
|
new file mode 100755
|
||||||
|
index 0000000..22ab6fd
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/operators.simde.c
|
||||||
|
@@ -0,0 +1,34 @@
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+// Samuel Williams
|
||||||
|
+// SWWilliams@lbl.gov
|
||||||
|
+// Lawrence Berkeley National Lab
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <stdint.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <math.h>
|
||||||
|
+// #include <immintrin.h>
|
||||||
|
+#define SIMDE_ENABLE_NATIVE_ALIASES
|
||||||
|
+#define SIMDE_X86_SSE_ENABLE_NATIVE_ALIASES
|
||||||
|
+#define _MM_HINT_T0 1
|
||||||
|
+#define _MM_HINT_T1 2
|
||||||
|
+#include "simde/x86/avx2.h"
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+#include "timer.h"
|
||||||
|
+#include "defines.h"
|
||||||
|
+#include "box.h"
|
||||||
|
+#include "mg.h"
|
||||||
|
+#include "operators.h"
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
+#include "operators.ompif/exchange_boundary.c"
|
||||||
|
+#include "operators.ompif/lambda.c"
|
||||||
|
+#include "operators.avx/gsrb.c"
|
||||||
|
+#include "operators.ompif/apply_op.c"
|
||||||
|
+#include "operators.ompif/residual.c"
|
||||||
|
+#include "operators.ompif/restriction.c"
|
||||||
|
+#include "operators.ompif/interpolation.c"
|
||||||
|
+#include "operators.ompif/misc.c"
|
||||||
|
+#include "operators.ompif/matmul.c"
|
||||||
|
+#include "operators.ompif/problem1.c"
|
||||||
|
+//------------------------------------------------------------------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user