Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1905 - in trunk: CMake Core/Math include


Chronological Thread 
  • From: bigler@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1905 - in trunk: CMake Core/Math include
  • Date: Tue, 4 Dec 2007 15:31:14 -0700 (MST)

Author: bigler
Date: Tue Dec  4 15:31:14 2007
New Revision: 1905

Modified:
   trunk/CMake/About.cmake
   trunk/CMake/CheckSSE.cmake
   trunk/CMake/sseTest.cc
   trunk/Core/Math/SSEDefs.h
   trunk/include/CMakeLists.txt
   trunk/include/MantaSSE.h.CMakeTemplate
Log:
CMake/About.cmake

  Remove the SvnInfo target.  This isn't necessary if you set the
  property of the source file to be GENERATED = TRUE.  Hopefully this
  will fix the recompiling bug.

CMake/CheckSSE.cmake

  After looking over the mailing list, I noticed that this was
  broken.  Hopefully this fixes things.

  I added a MANTA_SSE_TEST_VERBOSE cmake variable that will spit all
  sorts of stuff out while doing its work.

  I added a MANTA_SSE_CAST cmake variable that turns on if the
  MANTA_TEST_CAST test worked.

  Made MANTA_SSE_GCC, MANTA_SSE_CAST, and MANTA_SSE_TEST_VERBOSE
  advanced options, as users generally don't modify these settings.

CMake/sseTest.cc

  Made sure the default test uses both SSE and SSE2.
  
  Added a MANTA_TEST_CAST section.

  Added main() as TRY_COMPILE expects to compile an executable.

Core/Math/SSEDefs.h

  Instead of relying on compiler versions, we actually test for these
  features as part of cmake configure and set some compiler macro
  variables.

include/CMakeLists.txt
include/MantaSSE.h.CMakeTemplate

  Added MANTA_SSE_GCC and MANTA_SSE_CAST preprocessor macro variables
  to MantaSSE.h.


Modified: trunk/CMake/About.cmake
==============================================================================
--- trunk/CMake/About.cmake     (original)
+++ trunk/CMake/About.cmake     Tue Dec  4 15:31:14 2007
@@ -25,22 +25,18 @@
   COMMAND ${CMAKE_COMMAND} -P 
${CMAKE_BINARY_DIR}/CMake/src/ConfigureAbout.cmake
   )  
 
-# Add a custom target to run the whole thing whenever .svn/entries changes.
-ADD_CUSTOM_TARGET(
-  SvnInfo
-  # DEPENDS Must match custom command OUTPUT.
-  ALL
-  DEPENDS ${ABOUT_SRC} 
+# Since this is a generated file, mark it as such
+SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC}
+  PROPERTIES GENERATED TRUE
   )
   
+# Explicitly add the -fPIC flag.
+IF(NOT USING_WINDOWS_CL)
+  SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC} PROPERTIES COMPILE_FLAGS "-fPIC")
+ENDIF(NOT USING_WINDOWS_CL)
+
 # Add a static library.
 ADD_LIBRARY(About STATIC
   ${ABOUT_SRC}
   )
-
-# Explicitly add the -fPIC flag.
-SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC} PROPERTIES COMPILE_FLAGS "-fPIC")
-
-
-ADD_DEPENDENCIES(About SvnInfo)
 

Modified: trunk/CMake/CheckSSE.cmake
==============================================================================
--- trunk/CMake/CheckSSE.cmake  (original)
+++ trunk/CMake/CheckSSE.cmake  Tue Dec  4 15:31:14 2007
@@ -3,74 +3,120 @@
 ##################################################################
 # Test compilation.
 
-SET(NOT_MANTA_SSE 1)
+SET(MANTA_SSE_TEST_RESULT 0)
 
 # First try.
 SET(SSE_TEST_FILE ${CMAKE_SOURCE_DIR}/CMake/sseTest.cc)
-TRY_COMPILE(NOT_MANTA_SSE ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
+TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE 
${SSE_TEST_FILE}
   CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
-  OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+  OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
   )
 
+SET(MANTA_SSE_TEST_VERBOSE FALSE CACHE BOOL "Turn out verbose SSE checks")
+
+IF(MANTA_SSE_TEST_VERBOSE)
+  MESSAGE("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
+  MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+  MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+ENDIF(MANTA_SSE_TEST_VERBOSE)
+
 # If not, Try adding -msse flags and see if that makes it work.
-IF (NOT_MANTA_SSE) 
+IF (NOT MANTA_SSE_TEST_RESULT) 
+  IF(MANTA_SSE_TEST_VERBOSE)
+    MESSAGE("First sse build failed.  Trying to add some flags.")
+  ENDIF(MANTA_SSE_TEST_VERBOSE)
 
-  SET(BACKUP ${CMAKE_CXX_FLAGS})
   IF (USING_WINDOWS_CL)
-    SET(CMAKE_CXX_FLAGS "/arch:SSE /arch:SSE2 ${BACKUP}")
+    SET(SSE_FLAGS "/arch:SSE2")
   ELSE(USING_WINDOWS_CL)
-    SET(CMAKE_CXX_FLAGS "-msse -msse2 ${BACKUP}")
+    SET(SSE_FLAGS "-msse -msse2")
   ENDIF(USING_WINDOWS_CL)
-  
+
+  SET(SAFE_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}" CACHE STRING "" 
FORCE)
+
   # Test again.
-  TRY_COMPILE(NOT_MANTA_SSE ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
-    CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
-    OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+  TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE 
${SSE_TEST_FILE}
+    OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
     )
 
+  IF(MANTA_SSE_TEST_VERBOSE)
+    MESSAGE("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
+    MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+    MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+  ENDIF(MANTA_SSE_TEST_VERBOSE)
+
   # Reset the flags if they didn't help
-  IF(NOT_MANTA_SSE)
-    SET(CMAKE_CXX_FLAGS ${BACKUP})
-  ENDIF(NOT_MANTA_SSE)
+  IF(NOT MANTA_SSE_TEST_RESULT)
+    SET(CMAKE_CXX_FLAGS "${SAFE_CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
+  ENDIF(NOT MANTA_SSE_TEST_RESULT)
 
-ENDIF(NOT_MANTA_SSE) 
+ENDIF(NOT MANTA_SSE_TEST_RESULT)
 
 # Add additional try compile tests here...
 
 ##################################################################
-# Check if any of the tests passed.
+# Check if any of the tests passed, and perform additional feature searches.
 
-IF(NOT NOT_MANTA_SSE) # In other words, if any tests passed.
+IF(MANTA_SSE_TEST_RESULT) # In other words, if any tests passed.
 
+  IF(MANTA_SSE_TEST_VERBOSE)
+    MESSAGE("We have SSE.  Now doing feature tests.")
+  ENDIF(MANTA_SSE_TEST_VERBOSE)
+  
   SET(MANTA_SSE TRUE CACHE BOOL "Compile SSE code.")
 
   # Check to see if the system is using gcc sse intrinsics.
-  TRY_COMPILE(NOT_MANTA_SSE_GCC ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
-    CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
+  TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE 
${SSE_TEST_FILE}
     COMPILE_DEFINITIONS -DMANTA_TEST_GCC
-    OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+    OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
     )
 
-  IF(NOT NOT_MANTA_SSE_GCC)
+  IF(MANTA_SSE_TEST_VERBOSE)
+    MESSAGE("Test for GCC epi64 instrinsics")
+    MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+    MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+  ENDIF(MANTA_SSE_TEST_VERBOSE)
+
+  IF(MANTA_SSE_TEST_RESULT)
     SET(MANTA_SSE_GCC TRUE CACHE BOOL "Found *epi64x intrinsics")
-  ELSE(NOT NOT_MANTA_SSE_GCC)
+  ELSE(MANTA_SSE_TEST_RESULT)
     SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics" 
FORCE)
-  ENDIF(NOT NOT_MANTA_SSE_GCC)
+  ENDIF(MANTA_SSE_TEST_RESULT)
+
+  # Check to see if the compiler has the cast intrinsics
+  TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE 
${SSE_TEST_FILE}
+    COMPILE_DEFINITIONS -DMANTA_TEST_CAST
+    OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
+    )
+
+  IF(MANTA_SSE_TEST_VERBOSE)
+    MESSAGE("Test for casting instrinsics")
+    MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+    MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+  ENDIF(MANTA_SSE_TEST_VERBOSE)
+
+  IF(MANTA_SSE_TEST_RESULT)
+    SET(MANTA_SSE_CAST TRUE CACHE BOOL "Found casting intrinsics")
+  ELSE(MANTA_SSE_TEST_RESULT)
+    SET(MANTA_SSE_CAST FALSE CACHE BOOL "Couldn't find casting intrinsics" 
FORCE)
+  ENDIF(MANTA_SSE_TEST_RESULT)
 
-ELSE(NOT NOT_MANTA_SSE) # All tests failed.
+ELSE(MANTA_SSE_TEST_RESULT) # All tests failed.
 
   IF(MANTA_SSE)
-    MESSAGE("Couldn't compile with sse (already tried -msse options..).")
+    MESSAGE("Couldn't compile with sse (already tried ${SSE_FLAGS} 
options..).")
+    MESSAGE("--debug-trycompile may be passed to CMake to avoid cleaning up 
temporary TRY_COMPILE files.")
+    MESSAGE("Also try setting MANTA_SSE_TEST_VERBOSE to true in the advanced 
options to see compiler output.")
     MESSAGE("compiler:       " ${CMAKE_CXX_COMPILER})
     MESSAGE("compiler flags: " ${CMAKE_CXX_FLAGS})
-    MESSAGE(${OUTPUT})
+    MESSAGE(${MANTA_SSE_TEST_OUTPUT})
   ENDIF(MANTA_SSE)
 
-  # Nothing is available.
+  # Force SSE off
   SET(MANTA_SSE FALSE CACHE BOOL "Couldn't compile SSE code." FORCE)
-  SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics." 
FORCE)
 
-ENDIF(NOT NOT_MANTA_SSE)
+ENDIF(MANTA_SSE_TEST_RESULT)
 
 IF (CYGWIN)
   IF (MANTA_SSE)
@@ -79,3 +125,12 @@
   ENDIF (MANTA_SSE)
 ENDIF (CYGWIN)
 
+# Turn off other SSE variables if SSE isn't available
+IF(NOT MANTA_SSE)
+  SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics." 
FORCE)
+  SET(MANTA_SSE_CAST FALSE CACHE BOOL "Couldn't find casting intrinsics" 
FORCE)
+ENDIF(NOT MANTA_SSE)
+
+MARK_AS_ADVANCED(MANTA_SSE_GCC)
+MARK_AS_ADVANCED(MANTA_SSE_CAST)
+MARK_AS_ADVANCED(MANTA_SSE_TEST_VERBOSE)

Modified: trunk/CMake/sseTest.cc
==============================================================================
--- trunk/CMake/sseTest.cc      (original)
+++ trunk/CMake/sseTest.cc      Tue Dec  4 15:31:14 2007
@@ -1,6 +1,22 @@
 #include <emmintrin.h>
-static __m128 float_sse_var;
+
+static __m128 float_sse_var = _mm_set_ps1(1.f);
+static __m128i int_sse_var  = _mm_set1_epi32(2);
+
 #ifdef MANTA_TEST_GCC
-static __m128i int_sse_var = _mm_set1_epi64x( (long long)1 );
+static __m128i gcc_guy = _mm_set1_epi64x( (long long)1 );
 #endif
+
+#ifdef MANTA_TEST_CAST
+static __m128i cast_float_to_int = _mm_castps_si128(float_sse_var);
+static __m128  cast_int_to_float = _mm_castsi128_ps(cast_float_to_int);
+static __m128d cast_float_to_double = _mm_castps_pd(float_sse_var);
+static __m128  cast_double_to_float = _mm_castpd_ps(cast_float_to_double);
+#endif
+
+int main()
+{
+  return 0;
+}
+
 

Modified: trunk/Core/Math/SSEDefs.h
==============================================================================
--- trunk/Core/Math/SSEDefs.h   (original)
+++ trunk/Core/Math/SSEDefs.h   Tue Dec  4 15:31:14 2007
@@ -82,8 +82,7 @@
     int i[4];
   };    
 
-#if defined(__x86_64) && defined(__INTEL_COMPILER)
-
+#ifndef MANTA_SSE_GCC
   // Stores 1 64 bit int twice in 4 32 bit ints
   //
   // [high32, low32, high32, low32]
@@ -100,9 +99,8 @@
     
 #endif
 
-  //#ifdef __CYGWIN__
-#if (defined(__GNUC__) && __GNUC__ < 4 && !defined(__INTEL_COMPILER)) || 
(defined(_MSC_VER) && (_MSC_VER < 1500))
-  // Intel casting intrinsics.
+#ifndef MANTA_SSE_CAST
+  // Define some casting functions if the intrinsics don't exist
   static inline __m128i _mm_castps_si128(__m128  val) { union { __m128 f; 
__m128i i;} c; c.f = val; return c.i; }
   static inline __m128  _mm_castsi128_ps(__m128i val) { union { __m128 f; 
__m128i i;} c; c.i = val; return c.f; }
   static inline __m128d _mm_castps_pd   (__m128  val) { union { __m128 f; 
__m128d d;} c; c.f = val; return c.d; }

Modified: trunk/include/CMakeLists.txt
==============================================================================
--- trunk/include/CMakeLists.txt        (original)
+++ trunk/include/CMakeLists.txt        Tue Dec  4 15:31:14 2007
@@ -47,6 +47,18 @@
   SET(MANTA_SSE_DEF "0" CACHE INTERNAL "Turn off SSE code")
 ENDIF(MANTA_SSE)
 
+IF(MANTA_SSE_GCC)
+  SET(MANTA_SSE_GCC_DEF "1" CACHE INTERNAL "Has GCC 64 bit SSE extensions")
+ELSE(MANTA_SSE_GCC)
+  SET(MANTA_SSE_GCC_DEF "0" CACHE INTERNAL "Doesn't have GCC 64 bit SSE 
extensions")
+ENDIF(MANTA_SSE_GCC)
+
+IF(MANTA_SSE_CAST)
+  SET(MANTA_SSE_CAST_DEF "1" CACHE INTERNAL "Casting intrinsics found.")
+ELSE(MANTA_SSE_CAST)
+  SET(MANTA_SSE_CAST_DEF "0" CACHE INTERNAL "No casting intrinsics found.")
+ENDIF(MANTA_SSE_CAST)
+
 CONFIGURE_FILE(
   ${CMAKE_CURRENT_SOURCE_DIR}/MantaSSE.h.CMakeTemplate
   ${CMAKE_BINARY_DIR}/include/MantaSSE.h

Modified: trunk/include/MantaSSE.h.CMakeTemplate
==============================================================================
--- trunk/include/MantaSSE.h.CMakeTemplate      (original)
+++ trunk/include/MantaSSE.h.CMakeTemplate      Tue Dec  4 15:31:14 2007
@@ -34,4 +34,12 @@
 #define MANTA_SSE 1
 #endif
 
+#if ${MANTA_SSE_GCC_DEF}
+#  define MANTA_SSE_GCC ${MANTA_SSE_GCC_DEF}
+#endif
+
+#if ${MANTA_SSE_CAST_DEF}
+#  define MANTA_SSE_CAST ${MANTA_SSE_CAST_DEF}
+#endif
+
 #endif




  • [Manta] r1905 - in trunk: CMake Core/Math include, bigler, 12/04/2007

Archive powered by MHonArc 2.6.16.

Top of page