Support compilation with the Cray C and Fortran compilers (#3712)
authorMartin Kroeker <martin@ruby.chemie.uni-freiburg.de>
Thu, 4 Aug 2022 18:42:18 +0000 (20:42 +0200)
committerGitHub <noreply@github.com>
Thu, 4 Aug 2022 18:42:18 +0000 (20:42 +0200)
* Add support for the Cray Fortran compiler

Makefile.system
cmake/fc.cmake
cmake/system.cmake
f_check
f_check.pl

index 3be5efa..bada954 100644 (file)
@@ -1190,7 +1190,6 @@ FCOMMON_OPT += -i8
 endif
 endif
 endif
-
 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
 ifndef BINARY64
 FCOMMON_OPT += -n32
@@ -1200,11 +1199,9 @@ endif
 ifeq ($(CORE), LOONGSON3R3)
 FCOMMON_OPT += -loongson3 -static
 endif
-
 ifeq ($(CORE), LOONGSON3R4)
 FCOMMON_OPT += -loongson3 -static
 endif
-
 else
 ifndef BINARY64
 FCOMMON_OPT += -m32
@@ -1212,7 +1209,6 @@ else
 FCOMMON_OPT += -m64
 endif
 endif
-
 ifeq ($(USE_OPENMP), 1)
 FEXTRALIB   += -lstdc++
 FCOMMON_OPT += -mp
@@ -1220,7 +1216,6 @@ endif
 endif
 
 ifeq ($(C_COMPILER), OPEN64)
-
 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
 ifndef BINARY64
 CCOMMON_OPT += -n32
@@ -1230,13 +1225,10 @@ endif
 ifeq ($(CORE), LOONGSON3R3)
 CCOMMON_OPT += -loongson3 -static
 endif
-
 ifeq ($(CORE), LOONGSON3R4)
 CCOMMON_OPT += -loongson3 -static
 endif
-
 else
-
 ifndef BINARY64
 CCOMMON_OPT += -m32
 else
@@ -1282,6 +1274,19 @@ FCOMMON_OPT += -openmp
 endif
 endif
 
+ifeq ($(F_COMPILER), CRAY)
+CCOMMON_OPT += -DF_INTERFACE_INTEL
+FCOMMON_OPT += -hnopattern
+ifdef INTERFACE64
+ifneq ($(INTERFACE64), 0)
+FCOMMON_OPT += -s integer64
+endif
+endif
+ifneq ($(USE_OPENMP), 1)
+FCOMMON_OPT += -O noomp
+endif
+endif
+
 ifdef BINARY64
 ifdef INTERFACE64
 ifneq ($(INTERFACE64), 0)
@@ -1565,6 +1570,11 @@ endif
 
 ifeq ($(F_COMPILER),NAG)
 LAPACK_FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
+FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
+endif
+ifeq ($(F_COMPILER),CRAY)
+LAPACK_FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
+FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
 endif
 
 LAPACK_CFLAGS = $(CFLAGS)
index 9419960..773feca 100644 (file)
@@ -222,6 +222,17 @@ if (${F_COMPILER} STREQUAL "COMPAQ")
   endif ()
 endif ()
 
+if (${F_COMPILER} STREQUAL "CRAY")
+  set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_INTEL")
+  set(FCOMMON_OPT "${FCOMMON_OPT} -hnopattern")
+  if (INTERFACE64)
+    set (FCOMMON_OPT "${FCOMMON_OPT} -s integer64")
+  endif ()
+  if (NOT USE_OPENMP)
+    set(FCOMMON_OPT "${FCOMMON_OPT} -O noomp")
+  endif ()
+endif ()
+
 # from the root Makefile - this is for lapack-netlib to compile the correct secnd file.
 if (${F_COMPILER} STREQUAL "GFORTRAN")
   set(TIMER "INT_ETIME")
index cb911ad..a9fc0f4 100644 (file)
@@ -559,6 +559,14 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
   endforeach ()
 endif ()
 
+if ("${F_COMPILER}" STREQUAL "NAG" OR "${F_COMPILER}" STREQUAL "CRAY")
+  set(FILTER_FLAGS "-msse3;-mssse3;-msse4.1;-mavx;-mavx2,-mskylake-avx512")
+  foreach (FILTER_FLAG ${FILTER_FLAGS})
+    string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
+    string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
+  endforeach ()
+endif ()
+
 if ("${F_COMPILER}" STREQUAL "GFORTRAN")
   # lapack-netlib is rife with uninitialized warnings -hpa
   set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
diff --git a/f_check b/f_check
index 1499fa7..bb13e16 100755 (executable)
--- a/f_check
+++ b/f_check
@@ -45,7 +45,7 @@ if [ -z "$compiler" ]; then
              pathf90 pathf95
              pgf95 pgf90 pgf77 pgfortran nvfortran
              flang egfortran
-              ifort nagfor ifx"
+              ifort nagfor ifx ftn crayftn"
 
     for list in $lists; do
         for p in $path; do
@@ -82,6 +82,10 @@ else
                 vendor=FUJITSU
                 openmp='-Kopenmp'
                 ;;
+           *Cray*)
+               vendor=CRAY
+               openmp='-fopenmp'
+               ;;
             *GNU*|*GCC*)
 
                 v="${data#*GCC: *\) }"
@@ -295,6 +299,9 @@ fi
 if [ "$vendor" = "NAG" ]; then
     link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
 fi
+if [ "$vendor" = "CRAY" ]; then
+    link=`$compiler $openmp -hnopattern ftest2.f 2>&1 && rm -f a.out a.exe`
+fi
 linker_L=""
 linker_l=""
 linker_a=""
index 79e97b3..cfc7331 100644 (file)
@@ -34,7 +34,7 @@ if ($compiler eq "") {
              "pathf90", "pathf95",
              "pgf95", "pgf90", "pgf77", "pgfortran", "nvfortran",
              "flang", "egfortran",
-              "ifort", "nagfor", "ifx");
+              "ifort", "nagfor", "ifx", "ftn", "crayftn");
 
 OUTER:
     foreach $lists (@lists) {
@@ -76,6 +76,11 @@ if ($compiler eq "") {
            $vendor = FUJITSU;
            $openmp = "-Kopenmp";
 
+       } elsif ($data =~ /Cray/) {
+
+           $vendor = CRAY;
+           $openmp = "-fopenmp";
+
        } elsif ($data =~ /GNU/ || $data =~ /GCC/ ) {
 
             $data =~ s/\(+.*?\)+//g;
@@ -309,6 +314,9 @@ if (!$?) {
 if ( $vendor eq "NAG") {
            $link = `$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`;
     }
+if ( $vendor eq "CRAY") {
+           $link = `$compiler $openmp -hnopattern ftest2.f 2>&1 && rm -f a.out a.exe`;
+    }
 $linker_L = "";
 $linker_l = "";
 $linker_a = "";