@@ -1020,6 +1020,7 @@ def test_fft_env_vars_foss(self):
10201020 def test_fft_env_vars_intel (self ):
10211021 """Test setting of $FFT* environment variables using intel toolchain."""
10221022
1023+ self .modtool .purge ()
10231024 self .setup_sandbox_for_intel_fftw (self .test_prefix )
10241025 self .modtool .prepend_module_path (self .test_prefix )
10251026
@@ -1079,6 +1080,64 @@ def test_fft_env_vars_intel(self):
10791080 libfft_mt += '-Wl,-Bdynamic -liomp5 -lpthread'
10801081 self .assertEqual (tc .get_variable ('LIBFFT_MT' ), libfft_mt )
10811082
1083+ self .modtool .purge ()
1084+ self .setup_sandbox_for_intel_fftw (self .test_prefix , imklver = '2021.4.0' )
1085+ tc = self .get_toolchain ('intel' , version = '2021b' )
1086+ tc .prepare ()
1087+
1088+ fft_static_libs = 'libmkl_intel_lp64.a,libmkl_sequential.a,libmkl_core.a'
1089+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS' ), fft_static_libs )
1090+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS' ), fft_static_libs )
1091+
1092+ fft_static_libs_mt = 'libmkl_intel_lp64.a,libmkl_intel_thread.a,libmkl_core.a,'
1093+ fft_static_libs_mt += 'libiomp5.a,libpthread.a'
1094+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS_MT' ), fft_static_libs_mt )
1095+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS_MT' ), fft_static_libs_mt )
1096+
1097+ libfft = "-Wl,-Bstatic -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core "
1098+ libfft += "-Wl,--end-group -Wl,-Bdynamic"
1099+ self .assertEqual (tc .get_variable ('LIBFFT' ), libfft )
1100+
1101+ libfft_mt = "-Wl,-Bstatic -Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core "
1102+ libfft_mt += "-Wl,--end-group -Wl,-Bdynamic -liomp5 -lpthread"
1103+ self .assertEqual (tc .get_variable ('LIBFFT_MT' ), libfft_mt )
1104+
1105+ tc = self .get_toolchain ('intel' , version = '2021b' )
1106+ tc .set_options ({'openmp' : True })
1107+ tc .prepare ()
1108+
1109+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS' ), fft_static_libs )
1110+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS' ), fft_static_libs )
1111+
1112+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS_MT' ), fft_static_libs_mt )
1113+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS_MT' ), fft_static_libs_mt )
1114+
1115+ self .assertEqual (tc .get_variable ('LIBFFT' ), libfft )
1116+ self .assertEqual (tc .get_variable ('LIBFFT_MT' ), libfft_mt )
1117+
1118+ tc = self .get_toolchain ('intel' , version = '2021b' )
1119+ tc .set_options ({'usempi' : True })
1120+ tc .prepare ()
1121+
1122+ fft_static_libs = 'libfftw3x_cdft_lp64.a,libmkl_cdft_core.a,libmkl_blacs_intelmpi_lp64.a,'
1123+ fft_static_libs += 'libmkl_intel_lp64.a,libmkl_sequential.a,libmkl_core.a'
1124+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS' ), fft_static_libs )
1125+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS' ), fft_static_libs )
1126+
1127+ fft_static_libs_mt = 'libfftw3x_cdft_lp64.a,libmkl_cdft_core.a,libmkl_blacs_intelmpi_lp64.a,'
1128+ fft_static_libs_mt += 'libmkl_intel_lp64.a,libmkl_intel_thread.a,libmkl_core.a,libiomp5.a,libpthread.a'
1129+ self .assertEqual (tc .get_variable ('FFT_STATIC_LIBS_MT' ), fft_static_libs_mt )
1130+ self .assertEqual (tc .get_variable ('FFTW_STATIC_LIBS_MT' ), fft_static_libs_mt )
1131+
1132+ libfft = '-Wl,-Bstatic -Wl,--start-group -lfftw3x_cdft_lp64 -lmkl_cdft_core '
1133+ libfft += '-lmkl_blacs_intelmpi_lp64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group -Wl,-Bdynamic'
1134+ self .assertEqual (tc .get_variable ('LIBFFT' ), libfft )
1135+
1136+ libfft_mt = '-Wl,-Bstatic -Wl,--start-group -lfftw3x_cdft_lp64 -lmkl_cdft_core '
1137+ libfft_mt += '-lmkl_blacs_intelmpi_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -Wl,--end-group '
1138+ libfft_mt += '-Wl,-Bdynamic -liomp5 -lpthread'
1139+ self .assertEqual (tc .get_variable ('LIBFFT_MT' ), libfft_mt )
1140+
10821141 def test_fosscuda (self ):
10831142 """Test whether fosscuda is handled properly."""
10841143 tc = self .get_toolchain ("fosscuda" , version = "2018a" )
@@ -1124,17 +1183,37 @@ def setup_sandbox_for_intel_fftw(self, moddir, imklver='2018.1.163'):
11241183 ])
11251184 write_file (imkl_module_path , imkl_mod_txt )
11261185
1127- fftw_libs = ['fftw3xc_intel' , 'fftw3xc_pgi' , 'mkl_cdft_core' , 'mkl_blacs_intelmpi_lp64' ]
1128- fftw_libs += ['mkl_intel_lp64' , 'mkl_sequential' , 'mkl_core' , 'mkl_intel_ilp64' ]
1186+ mkl_libs = ['mkl_cdft_core' , 'mkl_blacs_intelmpi_lp64' ]
1187+ mkl_libs += ['mkl_intel_lp64' , 'mkl_sequential' , 'mkl_core' , 'mkl_intel_ilp64' ]
1188+ fftw_libs = ['fftw3xc_intel' , 'fftw3xc_pgi' ]
11291189 if LooseVersion (imklver ) >= LooseVersion ('11' ):
11301190 fftw_libs .extend (['fftw3x_cdft_ilp64' , 'fftw3x_cdft_lp64' ])
11311191 else :
11321192 fftw_libs .append ('fftw3x_cdft' )
11331193
1134- for subdir in ['mkl/lib/intel64' , 'compiler/lib/intel64' , 'lib/em64t' ]:
1194+ if LooseVersion (imklver ) >= LooseVersion ('2021.4.0' ):
1195+ imkl_fftw_module_path = os .path .join (moddir , 'imkl-FFTW' , imklver )
1196+ imkl_fftw_dir = os .path .join (self .test_prefix , 'software' , 'imkl-FFTW' , imklver )
1197+ imkl_fftw_mod_txt = '\n ' .join ([
1198+ "#%Module" ,
1199+ "setenv EBROOTIMKLMINFFTW %s" % imkl_fftw_dir ,
1200+ "setenv EBVERSIONIMKLMINFFTW %s" % imklver ,
1201+ ])
1202+ write_file (imkl_fftw_module_path , imkl_fftw_mod_txt )
1203+
1204+ subdir = 'mkl/%s/lib/intel64' % imklver
11351205 os .makedirs (os .path .join (imkl_dir , subdir ))
1136- for fftlib in fftw_libs :
1206+ for fftlib in mkl_libs :
11371207 write_file (os .path .join (imkl_dir , subdir , 'lib%s.a' % fftlib ), 'foo' )
1208+ subdir = 'lib'
1209+ os .makedirs (os .path .join (imkl_fftw_dir , subdir ))
1210+ for fftlib in fftw_libs :
1211+ write_file (os .path .join (imkl_fftw_dir , subdir , 'lib%s.a' % fftlib ), 'foo' )
1212+ else :
1213+ for subdir in ['mkl/lib/intel64' , 'compiler/lib/intel64' , 'lib/em64t' ]:
1214+ os .makedirs (os .path .join (imkl_dir , subdir ))
1215+ for fftlib in mkl_libs + fftw_libs :
1216+ write_file (os .path .join (imkl_dir , subdir , 'lib%s.a' % fftlib ), 'foo' )
11381217
11391218 def test_intel_toolchain (self ):
11401219 """Test for intel toolchain."""
0 commit comments