Fix compilation with PGI
authorRoland Schulz <roland@utk.edu>
Fri, 7 Dec 2012 05:26:43 +0000 (21:26 -0800)
committerRoland Schulz <roland@utk.edu>
Sat, 8 Dec 2012 04:54:31 +0000 (20:54 -0800)
- The GMX_TEST_CFLAG with /ARCH doesn't fail because it isn't
  recognized as flag. Thus it is added and then causes trouble later
  because it is treated as filename.
- Extra { } for omp ordered
- Add warning to not use PGI because it fails the regressiontests
  (12.9 and 12.10) or crashes during the compilation with internal
  compiler errors (12.5, 11.9) (I didn't test more than those
  4 versions).
- I think it is worthwile to fix the first two issues even if PGI
  is not recommended. They could also affect other compilers and
  furture PGI version hopefully don't produce incorrect results.

Change-Id: I6ea24498a6c6712a8ad4b604a0b3c685de1ce0be

CMakeLists.txt
src/mdlib/fft5d.c

index b9f3dfca9bf8e1ece05cbe3ff160b9c1fecb4945..ac998d0caeda216cccc7fe201505042ce4e99d64 100644 (file)
@@ -325,6 +325,10 @@ if(COMPILER_IS_CLANG_3_0)
     message(FATAL_ERROR "Your compiler is clang version 3.0, which is known to be buggy for GROMACS. Use a different compiler.")
 endif()
 
+if (CMAKE_C_COMPILER_ID STREQUAL "PGI")
+    message(WARNING "All tested PGI compiler versions (up to 12.9.0) generate binaries which produce incorrect results, or even fail to compile Gromacs. Highly recommended to use a different compiler. If you choose to use PGI, make sure to run the regressiontests.")
+endif()
+
 ########################################################################
 # Set up binary and library suffixing 
 ########################################################################
@@ -696,15 +700,15 @@ if(${GMX_CPU_ACCELERATION} STREQUAL "NONE")
 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
 
     GMX_TEST_CFLAG(GNU_SSE2_CFLAG "-msse2" GROMACS_C_FLAGS)
-    if(NOT GNU_SSE2_CFLAG)
+    if(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
         GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
-    endif(NOT GNU_SSE2_CFLAG)
+    endif(NOT GNU_SSE2_CFLAG AND GMX_NATIVE_WINDOWS)
 
     if (CMAKE_CXX_COMPILER_LOADED)
         GMX_TEST_CXXFLAG(GNU_SSE2_CXXFLAG "-msse2" GROMACS_CXX_FLAGS)
-        if(NOT GNU_SSE2_CXXFLAG)
+        if(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
             GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
-        endif(NOT GNU_SSE2_CXXFLAG)
+        endif(NOT GNU_SSE2_CXXFLAG AND GMX_NATIVE_WINDOWS)
     endif()
 
     # We dont warn for lacking SSE2 flag support, since that is probably standard today.
@@ -726,26 +730,30 @@ elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE2")
 elseif(${GMX_CPU_ACCELERATION} STREQUAL "SSE4.1")
 
     GMX_TEST_CFLAG(GNU_SSE4_CFLAG "-msse4.1" GROMACS_C_FLAGS)
-    if (NOT GNU_SSE4_CFLAG)
+    if (NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
         GMX_TEST_CFLAG(MSVC_SSE4_CFLAG "/arch:SSE4.1" GROMACS_C_FLAGS)
-    endif(NOT GNU_SSE4_CFLAG)
+    endif(NOT GNU_SSE4_CFLAG AND GMX_NATIVE_WINDOWS)
     if (NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
         message(WARNING "No C SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance.")
         # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
         # intrinsics when SSE2 support is enabled, so we try that instead.
-        GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
+       if (GMX_NATIVE_WINDOWS)
+            GMX_TEST_CFLAG(MSVC_SSE2_CFLAG "/arch:SSE2" GROMACS_C_FLAGS)
+        endif()
     endif(NOT GNU_SSE4_CFLAG AND NOT MSVC_SSE4_CFLAG)
 
     if (CMAKE_CXX_COMPILER_LOADED)
         GMX_TEST_CXXFLAG(GNU_SSE4_CXXFLAG "-msse4.1" GROMACS_CXX_FLAG)
-        if (NOT GNU_SSE4_CXXFLAG)
+        if (NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
             GMX_TEST_CXXFLAG(MSVC_SSE4_CXXFLAG "/arch:SSE4.1" GROMACS_CXX_FLAGS)
-        endif(NOT GNU_SSE4_CXXFLAG)
+        endif(NOT GNU_SSE4_CXXFLAG AND GMX_NATIVE_WINDOWS)
         if (NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG) 
             message(WARNING "No C++ SSE4.1 flag found. Consider a newer compiler, or use SSE2 for slightly lower performance.")
             # Not surprising if we end up here! MSVC current does not support the SSE4.1 flag. However, it appears to accept SSE4.1
             # intrinsics when SSE2 support is enabled, so we try that instead.
-            GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
+            if (GMX_NATIVE_WINDOWS)
+                GMX_TEST_CXXFLAG(MSVC_SSE2_CXXFLAG "/arch:SSE2" GROMACS_CXX_FLAGS)
+            endif()
         endif(NOT GNU_SSE4_CXXFLAG AND NOT MSVC_SSE4_CXXFLAG)
     endif()
 
@@ -769,18 +777,18 @@ elseif(${GMX_CPU_ACCELERATION} STREQUAL "AVX_128_FMA" OR ${GMX_CPU_ACCELERATION}
     # Set the AVX compiler flag for both these choices!
 
     GMX_TEST_CFLAG(GNU_AVX_CFLAG "-mavx" GROMACS_C_FLAGS)
-    if (NOT GNU_AVX_CFLAG)
+    if (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
         GMX_TEST_CFLAG(MSVC_AVX_CFLAG "/arch:AVX" GROMACS_C_FLAGS)
-    endif (NOT GNU_AVX_CFLAG)
+    endif (NOT GNU_AVX_CFLAG AND GMX_NATIVE_WINDOWS)
     if (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
         message(WARNING "No C AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
     endif (NOT GNU_AVX_CFLAG AND NOT MSVC_AVX_CFLAG)
 
     if (CMAKE_CXX_COMPILER_LOADED)
         GMX_TEST_CXXFLAG(GNU_AVX_CXXFLAG "-mavx" GROMACS_CXX_FLAGS)
-        if (NOT GNU_AVX_CXXFLAG)
+        if (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
             GMX_TEST_CXXFLAG(MSVC_AVX_CXXFLAG "/arch:AVX" GROMACS_CXX_FLAGS)
-        endif (NOT GNU_AVX_CXXFLAG)
+        endif (NOT GNU_AVX_CXXFLAG AND GMX_NATIVE_WINDOWS)
         if (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
             message(WARNING "No C++ AVX flag found. Consider a newer compiler, or try SSE4.1 (lower performance).")
         endif (NOT GNU_AVX_CXXFLAG AND NOT MSVC_AVX_CXXFLAG)
index ef1d5ff88d24ffeb5b6331de67135d48000636cf..4d4f58a450e87d71076270ba340d6ab30fa20fae 100644 (file)
@@ -528,6 +528,7 @@ fft5d_plan fft5d_plan_3d(int NG, int MG, int KG, MPI_Comm comm[2], int flags, t_
              */
 #pragma omp parallel for num_threads(nthreads) schedule(static) ordered
             for(t=0; t<nthreads; t++)
+            {    
 #pragma omp ordered
             {
                 int tsize = ((t+1)*pM[s]*pK[s]/nthreads)-(t*pM[s]*pK[s]/nthreads);
@@ -538,6 +539,7 @@ fft5d_plan fft5d_plan_3d(int NG, int MG, int KG, MPI_Comm comm[2], int flags, t_
                     gmx_fft_init_many_1d     ( &plan->p1d[s][t],  C[s], tsize, (flags&FFT5D_NOMEASURE)?GMX_FFT_FLAG_CONSERVATIVE:0 );
                 }
             }
+            }
         }
 
 #ifdef GMX_FFT_FFTW3