From b8015a71e90320062247fea07f6a13ddd553b044 Mon Sep 17 00:00:00 2001 From: Glenn Johnson Date: Wed, 27 Apr 2022 03:30:39 -0500 Subject: relion: add altcpu variant and fix fftw (#30097) This package was not setting FFTW when +mklfft was used with +cuda. Since both were set to 'True', the default build was not linked to any FFTW, leading to a run time error. It seems MKL support was conflated with alternative CPU acceleration support. This PR does the following: - adds the altcpu variant to specify non-GPU/CPU acceleration - sets a conflict between +altcpu and +cuda - sets an FFTW implementation - sets fltk+xft when +gui to get a decent looking GUI interface - sets tbb dependency only when +altcpu - adds dependency on ctffind - adds variant and dependency on motioncor2 - sets defaults for - qsub template location - ctffind location - motioncor2 location Co-authored-by: Massimiliano Culpo --- var/spack/repos/builtin/packages/relion/package.py | 69 +++++++++++++++++----- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/var/spack/repos/builtin/packages/relion/package.py b/var/spack/repos/builtin/packages/relion/package.py index 7bb6e92d6a..7f912fbe7e 100644 --- a/var/spack/repos/builtin/packages/relion/package.py +++ b/var/spack/repos/builtin/packages/relion/package.py @@ -36,35 +36,52 @@ class Relion(CMakePackage, CudaPackage): variant('cuda', default=True, description="enable compute on gpu") variant('double', default=True, description="double precision (cpu) code") variant('double-gpu', default=False, description="double precision gpu") + # if built with purpose=cluster then relion will link to gpfs libraries # if that's not desirable then use purpose=desktop variant('purpose', default='cluster', values=('cluster', 'desktop'), description="build relion for use in cluster or desktop") + variant('build_type', default='RelWithDebInfo', description='The build type to build', values=('Debug', 'Release', 'RelWithDebInfo', 'Profiling', 'Benchmarking')) + + # these new values were added in relion 3 + # do not seem to cause problems with < 3 variant('mklfft', default=True, description='Use MKL rather than FFTW for FFT') variant('allow_ctf_in_sagd', default=True, description='Allow CTF-modulation in SAGD, as specified in Claim 1 of patent US10,282,513B2') + variant('altcpu', default=False, description='Use CPU acceleration', when='~cuda') + + variant('external_motioncor2', + default=False, + description='Have external motioncor2 available in addition to ' + 'Relion builtin') depends_on('mpi') depends_on('cmake@3:', type='build') depends_on('fftw precision=float,double', when='~mklfft') - depends_on('fltk', when='+gui') + + # use the +xft variant so the interface is not so horrible looking + depends_on('fltk+xft', when='+gui') + depends_on('libtiff') depends_on('libpng', when='@4:') depends_on('cuda', when='+cuda') depends_on('cuda@9:', when='@3: +cuda') - depends_on('tbb', when='~cuda') - depends_on('mkl', when='~cuda +mklfft') - + depends_on('tbb', when='+altcpu') + depends_on('mkl', when='+mklfft') + depends_on('ctffind', type='run') + depends_on('motioncor2', type='run', when='+external_motioncor2') + + # TODO: more externals to add + # Spack packages needed + # - Gctf + # - ResMap patch('0002-Simple-patch-to-fix-intel-mkl-linking.patch', when='@:3.1.1 os=ubuntu18.04') def cmake_args(self): - - carch = self.spec.variants['cuda_arch'].value[0] - args = [ '-DCMAKE_C_FLAGS=-g', '-DCMAKE_CXX_FLAGS=-g', @@ -72,20 +89,24 @@ class Relion(CMakePackage, CudaPackage): '-DDoublePrec_CPU=%s' % ('+double' in self.spec), '-DDoublePrec_GPU=%s' % ('+double-gpu' in self.spec), '-DALLOW_CTF_IN_SAGD=%s' % ('+allow_ctf_in_sagd' in self.spec), + '-DMKLFFT=%s' % ('+mklfft' in self.spec), + '-DALTCPU=%s' % ('+altcpu' in self.spec), ] if '+cuda' in self.spec: + carch = self.spec.variants['cuda_arch'].value[0] + # relion+cuda requires selecting cuda_arch - if not carch: - raise ValueError("select cuda_arch when building with +cuda") + if carch == 'none': + raise ValueError( + 'Must select a value for cuda_arch' + ) else: - args += ['-DCUDA=ON', '-DCudaTexture=ON', - '-DCUDA_ARCH=%s' % (carch)] - - # these new values were added in relion 3 - # do not seem to cause problems with < 3 - else: - args += ['-DMKLFFT=%s' % ('+mklfft' in self.spec), '-DALTCPU=ON'] + args += [ + '-DCUDA=ON', + '-DCudaTexture=ON', + '-DCUDA_ARCH=%s' % (carch), + ] return args @@ -93,3 +114,19 @@ class Relion(CMakePackage, CudaPackage): # Remove flags not recognized by the NVIDIA compilers if self.spec.satisfies('%nvhpc'): filter_file('-std=c99', '-c99', 'src/apps/CMakeLists.txt') + + # set up some defaults + filter_file(r'(#define DEFAULTQSUBLOCATION).*', + r'\1 "{0}"'.format(join_path(self.spec.prefix.bin, + 'relion_qsub.csh')), + join_path('src', 'pipeline_jobs.h')) + filter_file(r'(#define DEFAULTCTFFINDLOCATION).*', + r'\1 "{0}"'.format(join_path( + self.spec['ctffind'].prefix.bin, 'ctffind')), + join_path('src', 'pipeline_jobs.h')) + + if '+external_motioncor2' in self.spec: + filter_file(r'(#define DEFAULTMOTIONCOR2LOCATION).*', + r'\1 "{0}"'.format(join_path( + self.spec['motioncor2'].prefix.bin, 'MotionCor2')), + join_path('src', 'pipeline_jobs.h')) -- cgit v1.2.3-70-g09d2