1*da0073e9SAndroid Build Coastguard Worker #ifndef C10_MACROS_MACROS_H_ 2*da0073e9SAndroid Build Coastguard Worker #define C10_MACROS_MACROS_H_ 3*da0073e9SAndroid Build Coastguard Worker #include <cassert> 4*da0073e9SAndroid Build Coastguard Worker 5*da0073e9SAndroid Build Coastguard Worker /* Main entry for c10/macros. 6*da0073e9SAndroid Build Coastguard Worker * 7*da0073e9SAndroid Build Coastguard Worker * In your code, include c10/macros/Macros.h directly, instead of individual 8*da0073e9SAndroid Build Coastguard Worker * files in this folder. 9*da0073e9SAndroid Build Coastguard Worker */ 10*da0073e9SAndroid Build Coastguard Worker 11*da0073e9SAndroid Build Coastguard Worker // For build systems that do not directly depend on CMake and directly build 12*da0073e9SAndroid Build Coastguard Worker // from the source directory (such as Buck), one may not have a cmake_macros.h 13*da0073e9SAndroid Build Coastguard Worker // file at all. In this case, the build system is responsible for providing 14*da0073e9SAndroid Build Coastguard Worker // correct macro definitions corresponding to the cmake_macros.h.in file. 15*da0073e9SAndroid Build Coastguard Worker // 16*da0073e9SAndroid Build Coastguard Worker // In such scenarios, one should define the macro 17*da0073e9SAndroid Build Coastguard Worker // C10_USING_CUSTOM_GENERATED_MACROS 18*da0073e9SAndroid Build Coastguard Worker // to inform this header that it does not need to include the cmake_macros.h 19*da0073e9SAndroid Build Coastguard Worker // file. 20*da0073e9SAndroid Build Coastguard Worker 21*da0073e9SAndroid Build Coastguard Worker #ifndef C10_USING_CUSTOM_GENERATED_MACROS 22*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/cmake_macros.h> 23*da0073e9SAndroid Build Coastguard Worker #endif // C10_USING_CUSTOM_GENERATED_MACROS 24*da0073e9SAndroid Build Coastguard Worker 25*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Export.h> 26*da0073e9SAndroid Build Coastguard Worker 27*da0073e9SAndroid Build Coastguard Worker #if defined(__clang__) 28*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_float_divide_by_zero__ \ 29*da0073e9SAndroid Build Coastguard Worker __attribute__((no_sanitize("float-divide-by-zero"))) 30*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_undefined__ __attribute__((no_sanitize("undefined"))) 31*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_signed_int_overflow__ \ 32*da0073e9SAndroid Build Coastguard Worker __attribute__((no_sanitize("signed-integer-overflow"))) 33*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_pointer_overflow__ \ 34*da0073e9SAndroid Build Coastguard Worker __attribute__((no_sanitize("pointer-overflow"))) 35*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_function__ __attribute__((no_sanitize("function"))) 36*da0073e9SAndroid Build Coastguard Worker #else 37*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_float_divide_by_zero__ 38*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_undefined__ 39*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_signed_int_overflow__ 40*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_pointer_overflow__ 41*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_function__ 42*da0073e9SAndroid Build Coastguard Worker #endif 43*da0073e9SAndroid Build Coastguard Worker 44*da0073e9SAndroid Build Coastguard Worker // Detect address sanitizer as some stuff doesn't work with it 45*da0073e9SAndroid Build Coastguard Worker #undef C10_ASAN_ENABLED 46*da0073e9SAndroid Build Coastguard Worker 47*da0073e9SAndroid Build Coastguard Worker // for clang 48*da0073e9SAndroid Build Coastguard Worker #if defined(__has_feature) 49*da0073e9SAndroid Build Coastguard Worker #if ((__has_feature(address_sanitizer))) 50*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 1 51*da0073e9SAndroid Build Coastguard Worker #endif 52*da0073e9SAndroid Build Coastguard Worker #endif 53*da0073e9SAndroid Build Coastguard Worker 54*da0073e9SAndroid Build Coastguard Worker // for gcc 55*da0073e9SAndroid Build Coastguard Worker #if defined(__SANITIZE_ADDRESS__) 56*da0073e9SAndroid Build Coastguard Worker #if __SANITIZE_ADDRESS__ 57*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_ASAN_ENABLED) 58*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 1 59*da0073e9SAndroid Build Coastguard Worker #endif 60*da0073e9SAndroid Build Coastguard Worker #endif 61*da0073e9SAndroid Build Coastguard Worker #endif 62*da0073e9SAndroid Build Coastguard Worker 63*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_ASAN_ENABLED) 64*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 0 65*da0073e9SAndroid Build Coastguard Worker #endif 66*da0073e9SAndroid Build Coastguard Worker 67*da0073e9SAndroid Build Coastguard Worker // Detect undefined-behavior sanitizer (UBSAN) 68*da0073e9SAndroid Build Coastguard Worker #undef C10_UBSAN_ENABLED 69*da0073e9SAndroid Build Coastguard Worker 70*da0073e9SAndroid Build Coastguard Worker // for clang or gcc >= 14 71*da0073e9SAndroid Build Coastguard Worker // NB: gcc 14 adds support for Clang's __has_feature 72*da0073e9SAndroid Build Coastguard Worker // https://gcc.gnu.org/gcc-14/changes.html 73*da0073e9SAndroid Build Coastguard Worker // gcc < 14 doesn't have a macro for UBSAN 74*da0073e9SAndroid Build Coastguard Worker // (e.g. __SANITIZE_UNDEFINED__ does not exist in gcc) 75*da0073e9SAndroid Build Coastguard Worker // https://github.com/google/sanitizers/issues/765 76*da0073e9SAndroid Build Coastguard Worker #if defined(__has_feature) 77*da0073e9SAndroid Build Coastguard Worker #if ((__has_feature(undefined_behavior_sanitizer))) 78*da0073e9SAndroid Build Coastguard Worker #define C10_UBSAN_ENABLED 1 79*da0073e9SAndroid Build Coastguard Worker #endif 80*da0073e9SAndroid Build Coastguard Worker #endif 81*da0073e9SAndroid Build Coastguard Worker 82*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_UBSAN_ENABLED) 83*da0073e9SAndroid Build Coastguard Worker #define C10_UBSAN_ENABLED 0 84*da0073e9SAndroid Build Coastguard Worker #endif 85*da0073e9SAndroid Build Coastguard Worker 86*da0073e9SAndroid Build Coastguard Worker // Disable the copy and assignment operator for a class. Note that this will 87*da0073e9SAndroid Build Coastguard Worker // disable the usage of the class in std containers. 88*da0073e9SAndroid Build Coastguard Worker #define C10_DISABLE_COPY_AND_ASSIGN(classname) \ 89*da0073e9SAndroid Build Coastguard Worker classname(const classname&) = delete; \ 90*da0073e9SAndroid Build Coastguard Worker classname& operator=(const classname&) = delete 91*da0073e9SAndroid Build Coastguard Worker 92*da0073e9SAndroid Build Coastguard Worker #define C10_CONCATENATE_IMPL(s1, s2) s1##s2 93*da0073e9SAndroid Build Coastguard Worker #define C10_CONCATENATE(s1, s2) C10_CONCATENATE_IMPL(s1, s2) 94*da0073e9SAndroid Build Coastguard Worker 95*da0073e9SAndroid Build Coastguard Worker #define C10_MACRO_EXPAND(args) args 96*da0073e9SAndroid Build Coastguard Worker 97*da0073e9SAndroid Build Coastguard Worker #define C10_STRINGIZE_IMPL(x) #x 98*da0073e9SAndroid Build Coastguard Worker #define C10_STRINGIZE(x) C10_STRINGIZE_IMPL(x) 99*da0073e9SAndroid Build Coastguard Worker 100*da0073e9SAndroid Build Coastguard Worker /** 101*da0073e9SAndroid Build Coastguard Worker * C10_ANONYMOUS_VARIABLE(str) introduces a new identifier which starts with 102*da0073e9SAndroid Build Coastguard Worker * str and ends with a unique number. 103*da0073e9SAndroid Build Coastguard Worker */ 104*da0073e9SAndroid Build Coastguard Worker #ifdef __COUNTER__ 105*da0073e9SAndroid Build Coastguard Worker #define C10_UID __COUNTER__ 106*da0073e9SAndroid Build Coastguard Worker #define C10_ANONYMOUS_VARIABLE(str) C10_CONCATENATE(str, __COUNTER__) 107*da0073e9SAndroid Build Coastguard Worker #else 108*da0073e9SAndroid Build Coastguard Worker #define C10_UID __LINE__ 109*da0073e9SAndroid Build Coastguard Worker #define C10_ANONYMOUS_VARIABLE(str) C10_CONCATENATE(str, __LINE__) 110*da0073e9SAndroid Build Coastguard Worker #endif 111*da0073e9SAndroid Build Coastguard Worker 112*da0073e9SAndroid Build Coastguard Worker #ifdef __has_cpp_attribute 113*da0073e9SAndroid Build Coastguard Worker #define C10_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) 114*da0073e9SAndroid Build Coastguard Worker #else 115*da0073e9SAndroid Build Coastguard Worker #define C10_HAS_CPP_ATTRIBUTE(x) (0) 116*da0073e9SAndroid Build Coastguard Worker #endif 117*da0073e9SAndroid Build Coastguard Worker 118*da0073e9SAndroid Build Coastguard Worker /// C10_NODISCARD - Warn if a type or return value is discarded. 119*da0073e9SAndroid Build Coastguard Worker 120*da0073e9SAndroid Build Coastguard Worker // Technically, we should check if __cplusplus > 201402L here, because 121*da0073e9SAndroid Build Coastguard Worker // [[nodiscard]] is only defined in C++17. However, some compilers 122*da0073e9SAndroid Build Coastguard Worker // we care about don't advertise being C++17 (e.g., clang), but 123*da0073e9SAndroid Build Coastguard Worker // support the attribute anyway. In fact, this is not just a good idea, 124*da0073e9SAndroid Build Coastguard Worker // it's the law: clang::warn_unused_result doesn't work on nvcc + clang 125*da0073e9SAndroid Build Coastguard Worker // and the best workaround for this case is to use [[nodiscard]] 126*da0073e9SAndroid Build Coastguard Worker // instead; see https://github.com/pytorch/pytorch/issues/13118 127*da0073e9SAndroid Build Coastguard Worker // 128*da0073e9SAndroid Build Coastguard Worker // Note to future editors: if you have noticed that a compiler is 129*da0073e9SAndroid Build Coastguard Worker // misbehaving (e.g., it advertises support, but the support doesn't 130*da0073e9SAndroid Build Coastguard Worker // actually work, or it is emitting warnings). Some compilers which 131*da0073e9SAndroid Build Coastguard Worker // are strict about the matter include MSVC, which will complain: 132*da0073e9SAndroid Build Coastguard Worker // 133*da0073e9SAndroid Build Coastguard Worker // error C2429: attribute 'nodiscard' requires compiler flag '/std:c++latest' 134*da0073e9SAndroid Build Coastguard Worker // 135*da0073e9SAndroid Build Coastguard Worker // Exhibits: 136*da0073e9SAndroid Build Coastguard Worker // - MSVC 19.14: https://godbolt.org/z/Dzd7gn (requires /std:c++latest) 137*da0073e9SAndroid Build Coastguard Worker // - Clang 8.0.0: https://godbolt.org/z/3PYL4Z (always advertises support) 138*da0073e9SAndroid Build Coastguard Worker // - gcc 8.3: https://godbolt.org/z/4tLMQS (always advertises support) 139*da0073e9SAndroid Build Coastguard Worker #if C10_HAS_CPP_ATTRIBUTE(nodiscard) 140*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD [[nodiscard]] 141*da0073e9SAndroid Build Coastguard Worker // Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious 142*da0073e9SAndroid Build Coastguard Worker // error when __has_cpp_attribute is given a scoped attribute in C mode. 143*da0073e9SAndroid Build Coastguard Worker #elif __cplusplus && C10_HAS_CPP_ATTRIBUTE(clang::warn_unused_result) 144*da0073e9SAndroid Build Coastguard Worker // TODO: It's possible this is still triggering 145*da0073e9SAndroid Build Coastguard Worker // https://github.com/pytorch/pytorch/issues/13118 on Windows; if it is, better 146*da0073e9SAndroid Build Coastguard Worker // fix it. 147*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD [[clang::warn_unused_result]] 148*da0073e9SAndroid Build Coastguard Worker #else 149*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD 150*da0073e9SAndroid Build Coastguard Worker #endif 151*da0073e9SAndroid Build Coastguard Worker 152*da0073e9SAndroid Build Coastguard Worker // suppress an unused variable. 153*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__) 154*da0073e9SAndroid Build Coastguard Worker #define C10_UNUSED __pragma(warning(suppress : 4100 4101)) 155*da0073e9SAndroid Build Coastguard Worker #else 156*da0073e9SAndroid Build Coastguard Worker #define C10_UNUSED __attribute__((__unused__)) 157*da0073e9SAndroid Build Coastguard Worker #endif //_MSC_VER 158*da0073e9SAndroid Build Coastguard Worker 159*da0073e9SAndroid Build Coastguard Worker #if !defined(__has_attribute) 160*da0073e9SAndroid Build Coastguard Worker #define __has_attribute(x) 0 161*da0073e9SAndroid Build Coastguard Worker #endif 162*da0073e9SAndroid Build Coastguard Worker 163*da0073e9SAndroid Build Coastguard Worker // Direct port of LLVM_ATTRIBUTE_USED. 164*da0073e9SAndroid Build Coastguard Worker #if __has_attribute(used) 165*da0073e9SAndroid Build Coastguard Worker #define C10_USED __attribute__((__used__)) 166*da0073e9SAndroid Build Coastguard Worker #else 167*da0073e9SAndroid Build Coastguard Worker #define C10_USED 168*da0073e9SAndroid Build Coastguard Worker #endif 169*da0073e9SAndroid Build Coastguard Worker 170*da0073e9SAndroid Build Coastguard Worker #define C10_RESTRICT __restrict 171*da0073e9SAndroid Build Coastguard Worker 172*da0073e9SAndroid Build Coastguard Worker // Simply define the namespace, in case a dependent library want to refer to 173*da0073e9SAndroid Build Coastguard Worker // the c10 namespace but not any nontrivial files. 174*da0073e9SAndroid Build Coastguard Worker namespace c10 {} 175*da0073e9SAndroid Build Coastguard Worker namespace c10::cuda {} 176*da0073e9SAndroid Build Coastguard Worker namespace c10::hip {} 177*da0073e9SAndroid Build Coastguard Worker namespace c10::xpu {} 178*da0073e9SAndroid Build Coastguard Worker 179*da0073e9SAndroid Build Coastguard Worker // Since C10 is the core library for caffe2 (and aten), we will simply reroute 180*da0073e9SAndroid Build Coastguard Worker // all abstractions defined in c10 to be available in caffe2 as well. 181*da0073e9SAndroid Build Coastguard Worker // This is only for backwards compatibility. Please use the symbols from the 182*da0073e9SAndroid Build Coastguard Worker // c10 namespace where possible. 183*da0073e9SAndroid Build Coastguard Worker namespace caffe2 { 184*da0073e9SAndroid Build Coastguard Worker using namespace c10; 185*da0073e9SAndroid Build Coastguard Worker } 186*da0073e9SAndroid Build Coastguard Worker namespace at { 187*da0073e9SAndroid Build Coastguard Worker using namespace c10; 188*da0073e9SAndroid Build Coastguard Worker } 189*da0073e9SAndroid Build Coastguard Worker namespace at::cuda { 190*da0073e9SAndroid Build Coastguard Worker using namespace c10::cuda; 191*da0073e9SAndroid Build Coastguard Worker } // namespace at::cuda 192*da0073e9SAndroid Build Coastguard Worker 193*da0073e9SAndroid Build Coastguard Worker // WARNING!!! THIS IS A GIANT HACK!!! 194*da0073e9SAndroid Build Coastguard Worker // This line means you cannot simultaneously include c10/hip 195*da0073e9SAndroid Build Coastguard Worker // and c10/cuda and then use them from the at::cuda namespace. 196*da0073e9SAndroid Build Coastguard Worker // This is true in practice, because HIPIFY works inplace on 197*da0073e9SAndroid Build Coastguard Worker // files in ATen/cuda, so it assumes that c10::hip is available 198*da0073e9SAndroid Build Coastguard Worker // from at::cuda. This namespace makes that happen. When 199*da0073e9SAndroid Build Coastguard Worker // HIPIFY is no longer out-of-place, we can switch the cuda 200*da0073e9SAndroid Build Coastguard Worker // here to hip and everyone is happy. 201*da0073e9SAndroid Build Coastguard Worker namespace at::cuda { 202*da0073e9SAndroid Build Coastguard Worker using namespace c10::hip; 203*da0073e9SAndroid Build Coastguard Worker } // namespace at::cuda 204*da0073e9SAndroid Build Coastguard Worker 205*da0073e9SAndroid Build Coastguard Worker namespace at::xpu { 206*da0073e9SAndroid Build Coastguard Worker using namespace c10::xpu; 207*da0073e9SAndroid Build Coastguard Worker } // namespace at::xpu 208*da0073e9SAndroid Build Coastguard Worker 209*da0073e9SAndroid Build Coastguard Worker // C10_LIKELY/C10_UNLIKELY 210*da0073e9SAndroid Build Coastguard Worker // 211*da0073e9SAndroid Build Coastguard Worker // These macros provide parentheses, so you can use these macros as: 212*da0073e9SAndroid Build Coastguard Worker // 213*da0073e9SAndroid Build Coastguard Worker // if C10_LIKELY(some_expr) { 214*da0073e9SAndroid Build Coastguard Worker // ... 215*da0073e9SAndroid Build Coastguard Worker // } 216*da0073e9SAndroid Build Coastguard Worker // 217*da0073e9SAndroid Build Coastguard Worker // NB: static_cast to boolean is mandatory in C++, because __builtin_expect 218*da0073e9SAndroid Build Coastguard Worker // takes a long argument, which means you may trigger the wrong conversion 219*da0073e9SAndroid Build Coastguard Worker // without it. 220*da0073e9SAndroid Build Coastguard Worker // 221*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__ICL) || defined(__clang__) 222*da0073e9SAndroid Build Coastguard Worker #define C10_LIKELY(expr) (__builtin_expect(static_cast<bool>(expr), 1)) 223*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY(expr) (__builtin_expect(static_cast<bool>(expr), 0)) 224*da0073e9SAndroid Build Coastguard Worker #else 225*da0073e9SAndroid Build Coastguard Worker #define C10_LIKELY(expr) (expr) 226*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY(expr) (expr) 227*da0073e9SAndroid Build Coastguard Worker #endif 228*da0073e9SAndroid Build Coastguard Worker 229*da0073e9SAndroid Build Coastguard Worker /// C10_NOINLINE - Functions whose declaration is annotated with this will not 230*da0073e9SAndroid Build Coastguard Worker /// be inlined. 231*da0073e9SAndroid Build Coastguard Worker #ifdef __GNUC__ 232*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE __attribute__((noinline)) 233*da0073e9SAndroid Build Coastguard Worker #elif _MSC_VER 234*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE __declspec(noinline) 235*da0073e9SAndroid Build Coastguard Worker #else 236*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE 237*da0073e9SAndroid Build Coastguard Worker #endif 238*da0073e9SAndroid Build Coastguard Worker 239*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) 240*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE __forceinline 241*da0073e9SAndroid Build Coastguard Worker #elif __has_attribute(always_inline) || defined(__GNUC__) 242*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE __attribute__((__always_inline__)) inline 243*da0073e9SAndroid Build Coastguard Worker #else 244*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE inline 245*da0073e9SAndroid Build Coastguard Worker #endif 246*da0073e9SAndroid Build Coastguard Worker 247*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) 248*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN 249*da0073e9SAndroid Build Coastguard Worker #elif defined(__GNUC__) 250*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN __attribute__((__visibility__("hidden"))) 251*da0073e9SAndroid Build Coastguard Worker #else 252*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN 253*da0073e9SAndroid Build Coastguard Worker #endif 254*da0073e9SAndroid Build Coastguard Worker 255*da0073e9SAndroid Build Coastguard Worker #define C10_ERASE C10_ALWAYS_INLINE C10_ATTR_VISIBILITY_HIDDEN 256*da0073e9SAndroid Build Coastguard Worker 257*da0073e9SAndroid Build Coastguard Worker #include <cstdint> 258*da0073e9SAndroid Build Coastguard Worker 259*da0073e9SAndroid Build Coastguard Worker #ifdef __HIPCC__ 260*da0073e9SAndroid Build Coastguard Worker // Unlike CUDA, HIP requires a HIP header to be included for __host__ to work. 261*da0073e9SAndroid Build Coastguard Worker // We do this #include here so that C10_HOST_DEVICE and friends will Just Work. 262*da0073e9SAndroid Build Coastguard Worker // See https://github.com/ROCm-Developer-Tools/HIP/issues/441 263*da0073e9SAndroid Build Coastguard Worker #include <hip/hip_runtime.h> 264*da0073e9SAndroid Build Coastguard Worker #endif 265*da0073e9SAndroid Build Coastguard Worker 266*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDACC__) || defined(__HIPCC__) 267*da0073e9SAndroid Build Coastguard Worker // Designates functions callable from the host (CPU) and the device (GPU) 268*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_DEVICE __host__ __device__ 269*da0073e9SAndroid Build Coastguard Worker #define C10_DEVICE __device__ 270*da0073e9SAndroid Build Coastguard Worker #define C10_HOST __host__ 271*da0073e9SAndroid Build Coastguard Worker // constants from 272*da0073e9SAndroid Build Coastguard Worker // (https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications) 273*da0073e9SAndroid Build Coastguard Worker // The maximum number of threads per multiprocessor is 1024 for Turing 274*da0073e9SAndroid Build Coastguard Worker // architecture (7.5), 1536 for Geforce Ampere (8.6)/Jetson Orin (8.7), and 275*da0073e9SAndroid Build Coastguard Worker // 2048 for all other architectures. You'll get warnings if you exceed these 276*da0073e9SAndroid Build Coastguard Worker // constants. Hence, the following macros adjust the input values from the user 277*da0073e9SAndroid Build Coastguard Worker // to resolve potential warnings. 278*da0073e9SAndroid Build Coastguard Worker #if __CUDA_ARCH__ == 750 279*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 1024; 280*da0073e9SAndroid Build Coastguard Worker #elif __CUDA_ARCH__ == 860 || __CUDA_ARCH__ == 870 || __CUDA_ARCH__ == 890 281*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 1536; 282*da0073e9SAndroid Build Coastguard Worker #else 283*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 2048; 284*da0073e9SAndroid Build Coastguard Worker #endif 285*da0073e9SAndroid Build Coastguard Worker // CUDA_MAX_THREADS_PER_BLOCK is same for all architectures currently 286*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_BLOCK = 1024; 287*da0073e9SAndroid Build Coastguard Worker // CUDA_THREADS_PER_BLOCK_FALLBACK is the "canonical fallback" choice of block 288*da0073e9SAndroid Build Coastguard Worker // size. 256 is a good number for this fallback and should give good occupancy 289*da0073e9SAndroid Build Coastguard Worker // and versatility across all architectures. 290*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_THREADS_PER_BLOCK_FALLBACK = 256; 291*da0073e9SAndroid Build Coastguard Worker // NOTE: if you are thinking of constexpr-ify the inputs to launch bounds, it 292*da0073e9SAndroid Build Coastguard Worker // turns out that although __launch_bounds__ can take constexpr, it 293*da0073e9SAndroid Build Coastguard Worker // can't take a constexpr that has anything to do with templates. 294*da0073e9SAndroid Build Coastguard Worker // Currently we use launch_bounds that depend on template arguments in 295*da0073e9SAndroid Build Coastguard Worker // Loops.cuh, Reduce.cuh and LossCTC.cuh. Hence, C10_MAX_THREADS_PER_BLOCK 296*da0073e9SAndroid Build Coastguard Worker // and C10_MIN_BLOCKS_PER_SM are kept as macros. 297*da0073e9SAndroid Build Coastguard Worker // Suppose you were planning to write __launch_bounds__(a, b), based on your 298*da0073e9SAndroid Build Coastguard Worker // performance tuning on a modern GPU. Instead, you should write 299*da0073e9SAndroid Build Coastguard Worker // __launch_bounds__(C10_MAX_THREADS_PER_BLOCK(a), C10_MIN_BLOCKS_PER_SM(a, b)), 300*da0073e9SAndroid Build Coastguard Worker // which will also properly respect limits on old architectures. 301*da0073e9SAndroid Build Coastguard Worker #define C10_MAX_THREADS_PER_BLOCK(val) \ 302*da0073e9SAndroid Build Coastguard Worker (((val) <= CUDA_MAX_THREADS_PER_BLOCK) ? (val) \ 303*da0073e9SAndroid Build Coastguard Worker : CUDA_THREADS_PER_BLOCK_FALLBACK) 304*da0073e9SAndroid Build Coastguard Worker #define C10_MIN_BLOCKS_PER_SM(threads_per_block, blocks_per_sm) \ 305*da0073e9SAndroid Build Coastguard Worker ((((threads_per_block) * (blocks_per_sm) <= CUDA_MAX_THREADS_PER_SM) \ 306*da0073e9SAndroid Build Coastguard Worker ? (blocks_per_sm) \ 307*da0073e9SAndroid Build Coastguard Worker : ((CUDA_MAX_THREADS_PER_SM + (threads_per_block)-1) / \ 308*da0073e9SAndroid Build Coastguard Worker (threads_per_block)))) 309*da0073e9SAndroid Build Coastguard Worker // C10_LAUNCH_BOUNDS is analogous to __launch_bounds__ 310*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_0 \ 311*da0073e9SAndroid Build Coastguard Worker __launch_bounds__( \ 312*da0073e9SAndroid Build Coastguard Worker 256, 4) // default launch bounds that should give good occupancy and 313*da0073e9SAndroid Build Coastguard Worker // versatility across all architectures. 314*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_1(max_threads_per_block) \ 315*da0073e9SAndroid Build Coastguard Worker __launch_bounds__((C10_MAX_THREADS_PER_BLOCK((max_threads_per_block)))) 316*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_2(max_threads_per_block, min_blocks_per_sm) \ 317*da0073e9SAndroid Build Coastguard Worker __launch_bounds__( \ 318*da0073e9SAndroid Build Coastguard Worker (C10_MAX_THREADS_PER_BLOCK((max_threads_per_block))), \ 319*da0073e9SAndroid Build Coastguard Worker (C10_MIN_BLOCKS_PER_SM((max_threads_per_block), (min_blocks_per_sm)))) 320*da0073e9SAndroid Build Coastguard Worker #else 321*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_DEVICE 322*da0073e9SAndroid Build Coastguard Worker #define C10_HOST 323*da0073e9SAndroid Build Coastguard Worker #define C10_DEVICE 324*da0073e9SAndroid Build Coastguard Worker #endif 325*da0073e9SAndroid Build Coastguard Worker 326*da0073e9SAndroid Build Coastguard Worker #if defined(USE_ROCM) 327*da0073e9SAndroid Build Coastguard Worker #define C10_HIP_HOST_DEVICE __host__ __device__ 328*da0073e9SAndroid Build Coastguard Worker #else 329*da0073e9SAndroid Build Coastguard Worker #define C10_HIP_HOST_DEVICE 330*da0073e9SAndroid Build Coastguard Worker #endif 331*da0073e9SAndroid Build Coastguard Worker 332*da0073e9SAndroid Build Coastguard Worker #if defined(USE_ROCM) 333*da0073e9SAndroid Build Coastguard Worker #define C10_WARP_SIZE warpSize // = 64 or 32 (Defined in hip_runtime.h) 334*da0073e9SAndroid Build Coastguard Worker #else 335*da0073e9SAndroid Build Coastguard Worker #define C10_WARP_SIZE 32 336*da0073e9SAndroid Build Coastguard Worker #endif 337*da0073e9SAndroid Build Coastguard Worker 338*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER <= 1900 339*da0073e9SAndroid Build Coastguard Worker #define __func__ __FUNCTION__ 340*da0073e9SAndroid Build Coastguard Worker #endif 341*da0073e9SAndroid Build Coastguard Worker 342*da0073e9SAndroid Build Coastguard Worker // CUDA_KERNEL_ASSERT checks the assertion 343*da0073e9SAndroid Build Coastguard Worker // even when NDEBUG is defined. This is useful for important assertions in CUDA 344*da0073e9SAndroid Build Coastguard Worker // code that would otherwise be suppressed when building Release. 345*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(__APPLE__) || defined(__FreeBSD__) 346*da0073e9SAndroid Build Coastguard Worker // Those platforms do not support assert() 347*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond) 348*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg) 349*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond) 350*da0073e9SAndroid Build Coastguard Worker #elif defined(_MSC_VER) 351*da0073e9SAndroid Build Coastguard Worker #if defined(NDEBUG) 352*da0073e9SAndroid Build Coastguard Worker extern "C" { 353*da0073e9SAndroid Build Coastguard Worker C10_IMPORT 354*da0073e9SAndroid Build Coastguard Worker #if defined(__SYCL_DEVICE_ONLY__) 355*da0073e9SAndroid Build Coastguard Worker extern SYCL_EXTERNAL void _wassert( 356*da0073e9SAndroid Build Coastguard Worker const wchar_t* wexpr, 357*da0073e9SAndroid Build Coastguard Worker const wchar_t* wfile, 358*da0073e9SAndroid Build Coastguard Worker unsigned line); 359*da0073e9SAndroid Build Coastguard Worker #else 360*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDA_ARCH__) 361*da0073e9SAndroid Build Coastguard Worker __host__ __device__ 362*da0073e9SAndroid Build Coastguard Worker #endif // __CUDA_ARCH__ 363*da0073e9SAndroid Build Coastguard Worker void 364*da0073e9SAndroid Build Coastguard Worker _wassert(wchar_t const* _Message, wchar_t const* _File, unsigned _Line); 365*da0073e9SAndroid Build Coastguard Worker #endif // __SYCL_DEVICE_ONLY__ 366*da0073e9SAndroid Build Coastguard Worker } 367*da0073e9SAndroid Build Coastguard Worker #endif // NDEBUG 368*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond) \ 369*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 370*da0073e9SAndroid Build Coastguard Worker (void)(_wassert( \ 371*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(#cond), \ 372*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(__FILE__), \ 373*da0073e9SAndroid Build Coastguard Worker static_cast<unsigned>(__LINE__)), \ 374*da0073e9SAndroid Build Coastguard Worker 0); \ 375*da0073e9SAndroid Build Coastguard Worker } 376*da0073e9SAndroid Build Coastguard Worker // TODO: This doesn't assert the message because I (chilli) couldn't figure out 377*da0073e9SAndroid Build Coastguard Worker // a nice way to convert a char* to a wchar_t* 378*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg) \ 379*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 380*da0073e9SAndroid Build Coastguard Worker (void)(_wassert( \ 381*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(#cond), \ 382*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(__FILE__), \ 383*da0073e9SAndroid Build Coastguard Worker static_cast<unsigned>(__LINE__)), \ 384*da0073e9SAndroid Build Coastguard Worker 0); \ 385*da0073e9SAndroid Build Coastguard Worker } 386*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond) \ 387*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 388*da0073e9SAndroid Build Coastguard Worker (void)(_wassert( \ 389*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(#cond), \ 390*da0073e9SAndroid Build Coastguard Worker _CRT_WIDE(__FILE__), \ 391*da0073e9SAndroid Build Coastguard Worker static_cast<unsigned>(__LINE__)), \ 392*da0073e9SAndroid Build Coastguard Worker 0); \ 393*da0073e9SAndroid Build Coastguard Worker } 394*da0073e9SAndroid Build Coastguard Worker #else // __APPLE__, _MSC_VER 395*da0073e9SAndroid Build Coastguard Worker #if defined(NDEBUG) 396*da0073e9SAndroid Build Coastguard Worker extern "C" { 397*da0073e9SAndroid Build Coastguard Worker #if defined(__SYCL_DEVICE_ONLY__) 398*da0073e9SAndroid Build Coastguard Worker extern SYCL_EXTERNAL void __assert_fail( 399*da0073e9SAndroid Build Coastguard Worker const char* expr, 400*da0073e9SAndroid Build Coastguard Worker const char* file, 401*da0073e9SAndroid Build Coastguard Worker unsigned int line, 402*da0073e9SAndroid Build Coastguard Worker const char* func); 403*da0073e9SAndroid Build Coastguard Worker #else // __SYCL_DEVICE_ONLY__ 404*da0073e9SAndroid Build Coastguard Worker #if (defined(__CUDA_ARCH__) && !(defined(__clang__) && defined(__CUDA__))) 405*da0073e9SAndroid Build Coastguard Worker // CUDA supports __assert_fail function which are common for both device 406*da0073e9SAndroid Build Coastguard Worker // and host side code. 407*da0073e9SAndroid Build Coastguard Worker __host__ __device__ 408*da0073e9SAndroid Build Coastguard Worker #endif 409*da0073e9SAndroid Build Coastguard Worker 410*da0073e9SAndroid Build Coastguard Worker // This forward declaration matching the declaration of __assert_fail 411*da0073e9SAndroid Build Coastguard Worker // exactly how it is in glibc in case parts of the program are compiled with 412*da0073e9SAndroid Build Coastguard Worker // different NDEBUG settings. Otherwise we might get 'ambiguous declaration' 413*da0073e9SAndroid Build Coastguard Worker // error. Note: On ROCm - this declaration serves for host side compilation. 414*da0073e9SAndroid Build Coastguard Worker void 415*da0073e9SAndroid Build Coastguard Worker __assert_fail( 416*da0073e9SAndroid Build Coastguard Worker const char* assertion, 417*da0073e9SAndroid Build Coastguard Worker const char* file, 418*da0073e9SAndroid Build Coastguard Worker unsigned int line, 419*da0073e9SAndroid Build Coastguard Worker const char* function) noexcept __attribute__((__noreturn__)); 420*da0073e9SAndroid Build Coastguard Worker 421*da0073e9SAndroid Build Coastguard Worker #endif // __SYCL_DEVICE_ONLY__ 422*da0073e9SAndroid Build Coastguard Worker } 423*da0073e9SAndroid Build Coastguard Worker #endif // NDEBUG 424*da0073e9SAndroid Build Coastguard Worker // ROCm disable kernel assert by default 425*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_USE_ROCM_KERNEL_ASSERT) and defined(USE_ROCM) 426*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond) 427*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg) 428*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond) 429*da0073e9SAndroid Build Coastguard Worker #else 430*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond) \ 431*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 432*da0073e9SAndroid Build Coastguard Worker __assert_fail( \ 433*da0073e9SAndroid Build Coastguard Worker #cond, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \ 434*da0073e9SAndroid Build Coastguard Worker } 435*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg) \ 436*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 437*da0073e9SAndroid Build Coastguard Worker __assert_fail( \ 438*da0073e9SAndroid Build Coastguard Worker msg, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \ 439*da0073e9SAndroid Build Coastguard Worker } 440*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond) \ 441*da0073e9SAndroid Build Coastguard Worker if (C10_UNLIKELY(!(cond))) { \ 442*da0073e9SAndroid Build Coastguard Worker __assert_fail( \ 443*da0073e9SAndroid Build Coastguard Worker #cond, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \ 444*da0073e9SAndroid Build Coastguard Worker } 445*da0073e9SAndroid Build Coastguard Worker #endif // C10_USE_ROCM_KERNEL_ASSERT and USE_ROCM 446*da0073e9SAndroid Build Coastguard Worker #endif // __APPLE__ 447*da0073e9SAndroid Build Coastguard Worker 448*da0073e9SAndroid Build Coastguard Worker #ifdef __APPLE__ 449*da0073e9SAndroid Build Coastguard Worker #include <TargetConditionals.h> 450*da0073e9SAndroid Build Coastguard Worker #endif 451*da0073e9SAndroid Build Coastguard Worker 452*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__) 453*da0073e9SAndroid Build Coastguard Worker #define C10_ANDROID 1 454*da0073e9SAndroid Build Coastguard Worker #define C10_MOBILE 1 455*da0073e9SAndroid Build Coastguard Worker #elif ( \ 456*da0073e9SAndroid Build Coastguard Worker defined(__APPLE__) && \ 457*da0073e9SAndroid Build Coastguard Worker (TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR || TARGET_OS_IPHONE)) 458*da0073e9SAndroid Build Coastguard Worker #define C10_IOS 1 459*da0073e9SAndroid Build Coastguard Worker #define C10_MOBILE 1 460*da0073e9SAndroid Build Coastguard Worker #endif // ANDROID / IOS 461*da0073e9SAndroid Build Coastguard Worker 462*da0073e9SAndroid Build Coastguard Worker #if defined(C10_MOBILE) && C10_MOBILE 463*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE_UNLESS_MOBILE inline 464*da0073e9SAndroid Build Coastguard Worker #else 465*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE_UNLESS_MOBILE C10_ALWAYS_INLINE 466*da0073e9SAndroid Build Coastguard Worker #endif 467*da0073e9SAndroid Build Coastguard Worker 468*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDA_ARCH__) 469*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(__CUDACC__) 470*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA const 471*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA __host__ 472*da0073e9SAndroid Build Coastguard Worker 473*da0073e9SAndroid Build Coastguard Worker // Note [static constexpr char* members for windows NVCC] 474*da0073e9SAndroid Build Coastguard Worker // The Windows NVCC compiler doesn't handle static constexpr class members, 475*da0073e9SAndroid Build Coastguard Worker // although it's fixed in a later version. 476*da0073e9SAndroid Build Coastguard Worker // (see 477*da0073e9SAndroid Build Coastguard Worker // https://developercommunity.visualstudio.com/t/intellisense-error-c11-static-constexpr-member-ini/245425) 478*da0073e9SAndroid Build Coastguard Worker // 479*da0073e9SAndroid Build Coastguard Worker // If we want to ensure that our field is static under all builds, then we need 480*da0073e9SAndroid Build Coastguard Worker // to work around it specifically for windows NVCC by making it (a) const, (b) 481*da0073e9SAndroid Build Coastguard Worker // defined outside of the class definition We need to define it outside of the 482*da0073e9SAndroid Build Coastguard Worker // class definition because of the C++ standard; char* is not an integral type 483*da0073e9SAndroid Build Coastguard Worker // (see 484*da0073e9SAndroid Build Coastguard Worker // https://stackoverflow.com/questions/24278473/intellisense-a-member-of-type-const-char-const-cannot-have-an-in-class-in) 485*da0073e9SAndroid Build Coastguard Worker // 486*da0073e9SAndroid Build Coastguard Worker // So instead of this: 487*da0073e9SAndroid Build Coastguard Worker // struct Foo { 488*da0073e9SAndroid Build Coastguard Worker // static constexpr const char* name = "foo"; 489*da0073e9SAndroid Build Coastguard Worker // } 490*da0073e9SAndroid Build Coastguard Worker // In Windows NVCC, we end up with this: 491*da0073e9SAndroid Build Coastguard Worker // struct Foo { 492*da0073e9SAndroid Build Coastguard Worker // static const char* name; 493*da0073e9SAndroid Build Coastguard Worker // } 494*da0073e9SAndroid Build Coastguard Worker // const char* Foo::name = "foo"; 495*da0073e9SAndroid Build Coastguard Worker // 496*da0073e9SAndroid Build Coastguard Worker // This gives us a small perf hit for any code that wants to access these field 497*da0073e9SAndroid Build Coastguard Worker // members, but right now it isn't used in any perf-critical code paths. 498*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \ 499*da0073e9SAndroid Build Coastguard Worker static const char* field; 500*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) \ 501*da0073e9SAndroid Build Coastguard Worker const char* cls::field = val; 502*da0073e9SAndroid Build Coastguard Worker #else 503*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA constexpr 504*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA __host__ 505*da0073e9SAndroid Build Coastguard Worker 506*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \ 507*da0073e9SAndroid Build Coastguard Worker static constexpr const char* field = val; 508*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) 509*da0073e9SAndroid Build Coastguard Worker #endif 510*da0073e9SAndroid Build Coastguard Worker #else 511*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(__CUDACC__) 512*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA const 513*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA 514*da0073e9SAndroid Build Coastguard Worker 515*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \ 516*da0073e9SAndroid Build Coastguard Worker static const char* field; 517*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) \ 518*da0073e9SAndroid Build Coastguard Worker const char* cls::field = val; 519*da0073e9SAndroid Build Coastguard Worker #else 520*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA constexpr 521*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA constexpr 522*da0073e9SAndroid Build Coastguard Worker 523*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \ 524*da0073e9SAndroid Build Coastguard Worker static constexpr const char* field = val; 525*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) 526*da0073e9SAndroid Build Coastguard Worker #endif 527*da0073e9SAndroid Build Coastguard Worker #endif 528*da0073e9SAndroid Build Coastguard Worker 529*da0073e9SAndroid Build Coastguard Worker #ifndef HAS_DEMANGLE 530*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(_WIN32) || defined(__EMSCRIPTEN__) 531*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 0 532*da0073e9SAndroid Build Coastguard Worker #elif defined(__APPLE__) && \ 533*da0073e9SAndroid Build Coastguard Worker (TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR || TARGET_OS_IPHONE) 534*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 0 535*da0073e9SAndroid Build Coastguard Worker #else 536*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 1 537*da0073e9SAndroid Build Coastguard Worker #endif 538*da0073e9SAndroid Build Coastguard Worker #endif // HAS_DEMANGLE 539*da0073e9SAndroid Build Coastguard Worker 540*da0073e9SAndroid Build Coastguard Worker #define _C10_PRAGMA__(string) _Pragma(#string) 541*da0073e9SAndroid Build Coastguard Worker #define _C10_PRAGMA_(string) _C10_PRAGMA__(string) 542*da0073e9SAndroid Build Coastguard Worker 543*da0073e9SAndroid Build Coastguard Worker #ifdef __clang__ 544*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_PUSH() _Pragma("clang diagnostic push") 545*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_POP() _Pragma("clang diagnostic pop") 546*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_IGNORE(flag) \ 547*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(clang diagnostic ignored flag) 548*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_HAS_WARNING(flag) __has_warning(flag) 549*da0073e9SAndroid Build Coastguard Worker #else 550*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_PUSH() 551*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_POP() 552*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_IGNORE(flag) 553*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_HAS_WARNING(flag) 0 554*da0073e9SAndroid Build Coastguard Worker #endif 555*da0073e9SAndroid Build Coastguard Worker 556*da0073e9SAndroid Build Coastguard Worker #ifdef __clang__ 557*da0073e9SAndroid Build Coastguard Worker 558*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning) \ 559*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(clang diagnostic push) \ 560*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(clang diagnostic ignored "-Wunknown-warning-option") \ 561*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(clang diagnostic ignored warning) 562*da0073e9SAndroid Build Coastguard Worker 563*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP() _C10_PRAGMA_(clang diagnostic pop) 564*da0073e9SAndroid Build Coastguard Worker 565*da0073e9SAndroid Build Coastguard Worker #elif __GNUC__ 566*da0073e9SAndroid Build Coastguard Worker 567*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning) \ 568*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(GCC diagnostic push) \ 569*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(GCC diagnostic ignored "-Wpragmas") \ 570*da0073e9SAndroid Build Coastguard Worker _C10_PRAGMA_(GCC diagnostic ignored warning) 571*da0073e9SAndroid Build Coastguard Worker 572*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP() _C10_PRAGMA_(GCC diagnostic pop) 573*da0073e9SAndroid Build Coastguard Worker 574*da0073e9SAndroid Build Coastguard Worker #else 575*da0073e9SAndroid Build Coastguard Worker 576*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning) 577*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP() 578*da0073e9SAndroid Build Coastguard Worker 579*da0073e9SAndroid Build Coastguard Worker #endif 580*da0073e9SAndroid Build Coastguard Worker 581*da0073e9SAndroid Build Coastguard Worker #endif // C10_MACROS_MACROS_H_ 582