/** * \file dnn/include/megdnn/arch.h * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #pragma once // include general build configurations #include "megdnn/config/config.h" #if defined(__GNUC__) || defined(__clang__) #if !defined(__clang__) // gcc specific #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if GCC_VERSION < 40800 #error "GCC version should be at least 4.8.0." #endif // GCC_VERSION < 40800 #endif // !defined(__clang__) #ifndef megdnn_trap #define megdnn_trap() __builtin_trap() #endif #define megdnn_likely(v) __builtin_expect(bool(v), 1) #define megdnn_unlikely(v) __builtin_expect(bool(v), 0) #if !defined(__clang__) && MEGDNN_ARMV7 && !defined(NDEBUG) //! Thumb2 limit code length #define MEGDNN_ALWAYS_INLINE #else #define MEGDNN_ALWAYS_INLINE inline __attribute__((__always_inline__)) #endif #define MEGDNN_DEPRECATED __attribute__((deprecated)) #define MEGDNN_PACKED __attribute__((packed)) #define MEGDNN_CONSTEXPR constexpr #define MEGDNN_NOEXCEPT noexcept #define MEGDNN_STATIC_ASSERT static_assert #define MEGDNN_FINAL final #define MEGDNN_NORETURN __attribute__((noreturn)) #define MEGDNN_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #define MEGDNN_ATTRIBUTE_TARGET(simd) __attribute__((target(simd))) #if defined(__clang_major__) && (__clang_major__ >= 7) #define MEGDNN_LAMBDA_ATTRIBUTE_TARGET(simd) __attribute__((target(simd))) #else #define MEGDNN_LAMBDA_ATTRIBUTE_TARGET(simd) [[gnu::target(simd)]] #endif #define MEGDNN_NOINLINE __attribute__((noinline)) #define megdnn_isatty(x) isatty(x) #elif defined(__INTEL_COMPILER) || defined(_MSC_VER) #ifndef megdnn_trap #define megdnn_trap() __debugbreak() #endif #define megdnn_likely(v) (bool(v)) #define megdnn_unlikely(v) (bool(v)) #define MEGDNN_DEPRECATED #define MEGDNN_PACKED #define MEGDNN_CONSTEXPR constexpr #define MEGDNN_NOEXCEPT noexcept #define MEGDNN_STATIC_ASSERT static_assert #define MEGDNN_FINAL final #if defined(_MSC_VER) #define MEGDNN_NORETURN __declspec(noreturn) #define MEGDNN_NOINLINE __declspec(noinline) #else #define MEGDNN_NORETURN #define MEGDNN_FORCE_NOINLINE #endif // _MSC_VER #define MEGDNN_WARN_UNUSED_RESULT #define megdnn_isatty(x) _isatty(x) #else #error "unknown compiler" #endif // __GNUC__ // __cpp_exceptions and __cpp_rtti is referred from // https://isocpp.org/std/standing-documentssd-6-sg10-feature-test-recommendations // gcc < 5 does not define __cpp_exceptions but __EXCEPTIONS, // similar for __GXX_RTTI // _CPPUNWIND and _CPPRTTI is used by MSVC, see // https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macrosview=vs-2019 #ifndef MEGDNN_ENABLE_EXCEPTIONS #if __cpp_exceptions || __EXCEPTIONS || (defined(_MSC_VER) && defined(_CPPUNWIND)) #define MEGDNN_ENABLE_EXCEPTIONS 1 #else #define MEGDNN_ENABLE_EXCEPTIONS 0 #endif #endif #ifndef MEGDNN_ENABLE_RTTI #if __cpp_rtti || __GXX_RTTI || (defined(_MSC_VER) && defined(_CPPRTTI)) #define MEGDNN_ENABLE_RTTI 1 #else #define MEGDNN_ENABLE_RTTI 0 #endif #endif #ifdef __CUDACC__ #define MEGDNN_CC_CUDA 1 #undef MEGDNN_CONSTEXPR #define MEGDNN_CONSTEXPR const #if defined(__CUDACC_VER_MAJOR__) #if __CUDACC_VER_MAJOR__ >= 9 #undef MEGDNN_STATIC_ASSERT #define MEGDNN_STATIC_ASSERT(cond, msg) static_assert(cond, msg); #else #undef MEGDNN_STATIC_ASSERT #define MEGDNN_STATIC_ASSERT(cond, msg) #endif #endif #define nullptr NULL #undef MEGDNN_FINAL #define MEGDNN_FINAL #elif defined(__HIPCC__) #define MEGDNN_CC_CUDA 1 #else #define MEGDNN_CC_HOST 1 #endif // __CUDACC__ // MEGDNN_HOST and MEGDNN_DEVICE #if MEGDNN_CC_CUDA #define MEGDNN_HOST __host__ #define MEGDNN_DEVICE __device__ #else #define MEGDNN_HOST #define MEGDNN_DEVICE #endif #if MEGDNN_CC_CUDA #define MEGDNN_FORCE_INLINE __forceinline__ #else #if __GNUC__ || __has_attribute(always_inline) #define MEGDNN_FORCE_INLINE inline __attribute__((always_inline)) #else #define MEGDNN_FORCE_INLINE inline #endif #endif #if defined(_MSC_VER) || defined(WIN32) #define ATTR_ALIGNED(v) __declspec(align(v)) #else #define ATTR_ALIGNED(v) __attribute__((aligned(v))) #endif // vim: syntax=cpp.doxygen