diff --git a/lib/kokkos/core/src/Kokkos_Macros.hpp b/lib/kokkos/core/src/Kokkos_Macros.hpp index 7874c32ee..40a46b302 100644 --- a/lib/kokkos/core/src/Kokkos_Macros.hpp +++ b/lib/kokkos/core/src/Kokkos_Macros.hpp @@ -1,473 +1,469 @@ /* //@HEADER // ************************************************************************ // // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the Corporation nor the names of the // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) // // ************************************************************************ //@HEADER */ #ifndef KOKKOS_MACROS_HPP #define KOKKOS_MACROS_HPP //---------------------------------------------------------------------------- /** Pick up configure/build options via #define macros: * * KOKKOS_HAVE_CUDA Kokkos::Cuda execution and memory spaces * KOKKOS_HAVE_PTHREAD Kokkos::Threads execution space * KOKKOS_HAVE_QTHREAD Kokkos::Qthread execution space * KOKKOS_HAVE_OPENMP Kokkos::OpenMP execution space * KOKKOS_HAVE_HWLOC HWLOC library is available * KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK insert array bounds checks, is expensive! * KOKKOS_HAVE_CXX11 enable C++11 features * * KOKKOS_HAVE_MPI negotiate MPI/execution space interactions * * KOKKOS_USE_CUDA_UVM Use CUDA UVM for Cuda memory space */ #ifndef KOKKOS_DONT_INCLUDE_CORE_CONFIG_H #include <KokkosCore_config.h> #endif //---------------------------------------------------------------------------- /** Pick up compiler specific #define macros: * * Macros for known compilers evaluate to an integral version value * * KOKKOS_COMPILER_NVCC * KOKKOS_COMPILER_GNU * KOKKOS_COMPILER_INTEL * KOKKOS_COMPILER_IBM * KOKKOS_COMPILER_CRAYC * KOKKOS_COMPILER_APPLECC * KOKKOS_COMPILER_CLANG * KOKKOS_COMPILER_PGI * * Macros for which compiler extension to use for atomics on intrinsice types * * KOKKOS_ATOMICS_USE_CUDA * KOKKOS_ATOMICS_USE_GNU * KOKKOS_ATOMICS_USE_INTEL * KOKKOS_ATOMICS_USE_OPENMP31 * * A suite of 'KOKKOS_HAVE_PRAGMA_...' are defined for internal use. * * Macros for marking functions to run in an execution space: * * KOKKOS_FUNCTION * KOKKOS_INLINE_FUNCTION request compiler to inline * KOKKOS_FORCEINLINE_FUNCTION force compiler to inline, use with care! */ //---------------------------------------------------------------------------- #if defined( KOKKOS_HAVE_CUDA ) && defined( __CUDACC__ ) /* Compiling with a CUDA compiler. * * Include <cuda.h> to pick up the CUDA_VERSION macro defined as: * CUDA_VERSION = ( MAJOR_VERSION * 1000 ) + ( MINOR_VERSION * 10 ) * * When generating device code the __CUDA_ARCH__ macro is defined as: * __CUDA_ARCH__ = ( MAJOR_CAPABILITY * 100 ) + ( MINOR_CAPABILITY * 10 ) */ #include <cuda_runtime.h> #include <cuda.h> #if ! defined( CUDA_VERSION ) #error "#include <cuda.h> did not define CUDA_VERSION" #endif #if ( CUDA_VERSION < 6050 ) // CUDA supports (inofficially) C++11 in device code starting with // version 6.5. This includes auto type and device code internal // lambdas. #error "Cuda version 6.5 or greater required" #endif #if defined( __CUDA_ARCH__ ) && ( __CUDA_ARCH__ < 300 ) /* Compiling with CUDA compiler for device code. */ #error "Cuda device capability >= 3.0 is required" #endif #ifdef KOKKOS_CUDA_USE_LAMBDA #if ( CUDA_VERSION < 7000 ) // CUDA supports C++11 lambdas generated in host code to be given // to the device starting with version 7.5. But the release candidate (7.5.6) // still identifies as 7.0 #error "Cuda version 7.5 or greater required for host-to-device Lambda support" #endif #define KOKKOS_LAMBDA [=]__device__ #define KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA 1 #endif #endif /* #if defined( KOKKOS_HAVE_CUDA ) && defined( __CUDACC__ ) */ /*--------------------------------------------------------------------------*/ /* Language info: C++, CUDA, OPENMP */ #if defined( __CUDA_ARCH__ ) && defined( KOKKOS_HAVE_CUDA ) // Compiling Cuda code to 'ptx' #define KOKKOS_FORCEINLINE_FUNCTION __device__ __host__ __forceinline__ #define KOKKOS_INLINE_FUNCTION __device__ __host__ inline #define KOKKOS_FUNCTION __device__ __host__ #endif /* #if defined( __CUDA_ARCH__ ) */ #if defined( _OPENMP ) /* Compiling with OpenMP. * The value of _OPENMP is an integer value YYYYMM * where YYYY and MM are the year and month designation * of the supported OpenMP API version. */ #endif /* #if defined( _OPENMP ) */ /*--------------------------------------------------------------------------*/ /* Mapping compiler built-ins to KOKKOS_COMPILER_*** macros */ #if defined( __NVCC__ ) // NVIDIA compiler is being used. // Code is parsed and separated into host and device code. // Host code is compiled again with another compiler. // Device code is compile to 'ptx'. #define KOKKOS_COMPILER_NVCC __NVCC__ #else #if defined( KOKKOS_HAVE_CXX11 ) && ! defined( KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA ) // CUDA (including version 6.5) does not support giving lambdas as // arguments to global functions. Thus its not currently possible // to dispatch lambdas from the host. #define KOKKOS_HAVE_CXX11_DISPATCH_LAMBDA 1 #endif #endif /* #if defined( __NVCC__ ) */ #if defined( KOKKOS_HAVE_CXX11 ) && !defined (KOKKOS_LAMBDA) #define KOKKOS_LAMBDA [=] #endif #if ! defined( __CUDA_ARCH__ ) /* Not compiling Cuda code to 'ptx'. */ /* Intel compiler for host code */ #if defined( __INTEL_COMPILER ) #define KOKKOS_COMPILER_INTEL __INTEL_COMPILER #elif defined( __ICC ) // Old define #define KOKKOS_COMPILER_INTEL __ICC #elif defined( __ECC ) // Very old define #define KOKKOS_COMPILER_INTEL __ECC #endif /* CRAY compiler for host code */ #if defined( _CRAYC ) #define KOKKOS_COMPILER_CRAYC _CRAYC #endif #if defined( __IBMCPP__ ) // IBM C++ #define KOKKOS_COMPILER_IBM __IBMCPP__ #elif defined( __IBMC__ ) #define KOKKOS_COMPILER_IBM __IBMC__ #endif #if defined( __APPLE_CC__ ) #define KOKKOS_COMPILER_APPLECC __APPLE_CC__ #endif #if defined (__clang__) && !defined (KOKKOS_COMPILER_INTEL) #define KOKKOS_COMPILER_CLANG __clang_major__*100+__clang_minor__*10+__clang_patchlevel__ #endif #if ! defined( __clang__ ) && ! defined( KOKKOS_COMPILER_INTEL ) &&defined( __GNUC__ ) #define KOKKOS_COMPILER_GNU __GNUC__*100+__GNUC_MINOR__*10+__GNUC_PATCHLEVEL__ #if ( 472 > KOKKOS_COMPILER_GNU ) #error "Compiling with GCC version earlier than 4.7.2 is not supported." #endif #endif #if defined( __PGIC__ ) && ! defined( __GNUC__ ) #define KOKKOS_COMPILER_PGI __PGIC__*100+__PGIC_MINOR__*10+__PGIC_PATCHLEVEL__ #if ( 1540 > KOKKOS_COMPILER_PGI ) #error "Compiling with PGI version earlier than 15.4 is not supported." #endif #endif #endif /* #if ! defined( __CUDA_ARCH__ ) */ /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ /* Intel compiler macros */ #if defined( KOKKOS_COMPILER_INTEL ) #define KOKKOS_HAVE_PRAGMA_UNROLL 1 #define KOKKOS_HAVE_PRAGMA_IVDEP 1 #define KOKKOS_HAVE_PRAGMA_LOOPCOUNT 1 #define KOKKOS_HAVE_PRAGMA_VECTOR 1 #define KOKKOS_HAVE_PRAGMA_SIMD 1 #if ( 1400 > KOKKOS_COMPILER_INTEL ) #if ( 1300 > KOKKOS_COMPILER_INTEL ) #error "Compiling with Intel version earlier than 13.0 is not supported. Official minimal version is 14.0." #else #warning "Compiling with Intel version 13.x probably works but is not officially supported. Official minimal version is 14.0." #endif #endif #if ( 1200 <= KOKKOS_COMPILER_INTEL ) && ! defined( KOKKOS_ENABLE_ASM ) && ! defined( _WIN32 ) #define KOKKOS_ENABLE_ASM 1 #endif #if ( 1200 <= KOKKOS_COMPILER_INTEL ) && ! defined( KOKKOS_FORCEINLINE_FUNCTION ) #if !defined (_WIN32) #define KOKKOS_FORCEINLINE_FUNCTION inline __attribute__((always_inline)) #else #define KOKKOS_FORCEINLINE_FUNCTION inline #endif #endif #if defined( __MIC__ ) // Compiling for Xeon Phi #endif #endif /*--------------------------------------------------------------------------*/ /* Cray compiler macros */ #if defined( KOKKOS_COMPILER_CRAYC ) #endif /*--------------------------------------------------------------------------*/ /* IBM Compiler macros */ #if defined( KOKKOS_COMPILER_IBM ) #define KOKKOS_HAVE_PRAGMA_UNROLL 1 //#define KOKKOS_HAVE_PRAGMA_IVDEP 1 //#define KOKKOS_HAVE_PRAGMA_LOOPCOUNT 1 //#define KOKKOS_HAVE_PRAGMA_VECTOR 1 //#define KOKKOS_HAVE_PRAGMA_SIMD 1 #endif /*--------------------------------------------------------------------------*/ /* CLANG compiler macros */ #if defined( KOKKOS_COMPILER_CLANG ) //#define KOKKOS_HAVE_PRAGMA_UNROLL 1 //#define KOKKOS_HAVE_PRAGMA_IVDEP 1 //#define KOKKOS_HAVE_PRAGMA_LOOPCOUNT 1 //#define KOKKOS_HAVE_PRAGMA_VECTOR 1 //#define KOKKOS_HAVE_PRAGMA_SIMD 1 #if ! defined( KOKKOS_FORCEINLINE_FUNCTION ) #define KOKKOS_FORCEINLINE_FUNCTION inline __attribute__((always_inline)) #endif #endif /*--------------------------------------------------------------------------*/ /* GNU Compiler macros */ #if defined( KOKKOS_COMPILER_GNU ) //#define KOKKOS_HAVE_PRAGMA_UNROLL 1 //#define KOKKOS_HAVE_PRAGMA_IVDEP 1 //#define KOKKOS_HAVE_PRAGMA_LOOPCOUNT 1 //#define KOKKOS_HAVE_PRAGMA_VECTOR 1 //#define KOKKOS_HAVE_PRAGMA_SIMD 1 #if ! defined( KOKKOS_FORCEINLINE_FUNCTION ) #define KOKKOS_FORCEINLINE_FUNCTION inline __attribute__((always_inline)) #endif #if ! defined( KOKKOS_ENABLE_ASM ) && \ ! ( defined( __powerpc) || \ defined(__powerpc__) || \ defined(__powerpc64__) || \ defined(__POWERPC__) || \ defined(__ppc__) || \ defined(__ppc64__) || \ defined(__PGIC__) ) #define KOKKOS_ENABLE_ASM 1 #endif #endif /*--------------------------------------------------------------------------*/ #if defined( KOKKOS_COMPILER_PGI ) #define KOKKOS_HAVE_PRAGMA_UNROLL 1 #define KOKKOS_HAVE_PRAGMA_IVDEP 1 //#define KOKKOS_HAVE_PRAGMA_LOOPCOUNT 1 #define KOKKOS_HAVE_PRAGMA_VECTOR 1 //#define KOKKOS_HAVE_PRAGMA_SIMD 1 #endif /*--------------------------------------------------------------------------*/ #if defined( KOKKOS_COMPILER_NVCC ) #if defined(__CUDA_ARCH__ ) #define KOKKOS_HAVE_PRAGMA_UNROLL 1 #endif #endif //---------------------------------------------------------------------------- /** Define function marking macros if compiler specific macros are undefined: */ #if ! defined( KOKKOS_FORCEINLINE_FUNCTION ) #define KOKKOS_FORCEINLINE_FUNCTION inline #endif #if ! defined( KOKKOS_INLINE_FUNCTION ) #define KOKKOS_INLINE_FUNCTION inline #endif #if ! defined( KOKKOS_FUNCTION ) #define KOKKOS_FUNCTION /**/ #endif //---------------------------------------------------------------------------- /** Define Macro for alignment: */ #if ! defined(KOKKOS_ALIGN_16) #define KOKKOS_ALIGN_16 __attribute__((aligned(16))) #endif //---------------------------------------------------------------------------- /** Determine the default execution space for parallel dispatch. * There is zero or one default execution space specified. */ #if 1 < ( ( defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_CUDA ) ? 1 : 0 ) + \ ( defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_OPENMP ) ? 1 : 0 ) + \ ( defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_THREADS ) ? 1 : 0 ) + \ ( defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_SERIAL ) ? 1 : 0 ) ) #error "More than one KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_* specified" ; #endif /** If default is not specified then chose from enabled execution spaces. * Priority: CUDA, OPENMP, THREADS, SERIAL */ #if defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_CUDA ) #elif defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_OPENMP ) #elif defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_THREADS ) #elif defined ( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_SERIAL ) #elif defined ( KOKKOS_HAVE_CUDA ) #define KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_CUDA #elif defined ( KOKKOS_HAVE_OPENMP ) #define KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_OPENMP #elif defined ( KOKKOS_HAVE_PTHREAD ) #define KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_THREADS #else #define KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_SERIAL #endif //---------------------------------------------------------------------------- /** Determine for what space the code is being compiled: */ #if defined( __CUDACC__ ) && defined( __CUDA_ARCH__ ) && defined (KOKKOS_HAVE_CUDA) #define KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_CUDA #else #define KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST #endif //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- #if ( defined( _POSIX_C_SOURCE ) && _POSIX_C_SOURCE >= 200112L ) || \ ( defined( _XOPEN_SOURCE ) && _XOPEN_SOURCE >= 600 ) #if defined(KOKKOS_ENABLE_PERFORMANCE_POSIX_MEMALIGN) #define KOKKOS_POSIX_MEMALIGN_AVAILABLE 1 #endif #endif //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- /**Enable Profiling by default**/ #ifndef KOKKOS_ENABLE_PROFILING #define KOKKOS_ENABLE_PROFILING 1 #endif //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- /* Transitional macro to change between old and new View, * default to use new View. */ -#undef KOKKOS_USING_EXP_VIEW -#undef KOKKOS_USING_EXPERIMENTAL_VIEW -#define KOKKOS_USING_DEPRECATED_VIEW - #if ! defined( KOKKOS_USING_EXP_VIEW ) #if defined( KOKKOS_USING_DEPRECATED_VIEW ) #define KOKKOS_USING_EXP_VIEW 0 #else #define KOKKOS_USING_EXP_VIEW 1 #endif #endif #if KOKKOS_USING_EXP_VIEW #if ! defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) #define KOKKOS_USING_EXPERIMENTAL_VIEW #endif #else /* ! KOKKOS_USING_EXP_VIEW */ #if defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) #error "KOKKOS_USING_EXP_VIEW and KOKKOS_USING_EXPERIMENAL_VIEW are both defined and are incompatible" #endif #endif //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- #endif /* #ifndef KOKKOS_MACROS_HPP */