16 #include "LvArrayConfig.hpp" 23 #include <type_traits> 26 #if defined(LVARRAY_USE_CUDA) || defined(LVARRAY_USE_HIP) 27 #define LVARRAY_USE_DEVICE 31 #if defined(LVARRAY_USE_CUDA) 32 #define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::cuda 33 #elif defined(LVARRAY_USE_HIP) 34 #define LVARRAY_DEFAULT_DEVICE_SPACE MemorySpace::hip 37 #if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) 38 #define LVARRAY_DEVICE_COMPILE 40 #define LVARRAY_FORCE_INLINE __forceinline__ 43 #define LVARRAY_FORCE_INLINE inline 47 #if defined(__CUDACC__) || defined(__HIPCC__) 49 #define LVARRAY_DECORATE 61 #define STRINGIZE_NX( A ) #A 67 #define STRINGIZE( A ) STRINGIZE_NX( A ) 73 #define LVARRAY_UNUSED_ARG( X ) 79 #define LVARRAY_UNUSED_VARIABLE( X ) ( ( void ) X ) 85 #define LVARRAY_DEBUG_VAR( X ) LVARRAY_UNUSED_VARIABLE( X ) 88 #define LOCATION __FILE__ ":" STRINGIZE( __LINE__ ) 94 #define TYPEOFPTR( X ) std::remove_pointer_t< decltype( X ) > 100 #define TYPEOFREF( X ) std::remove_reference_t< decltype( X ) > 105 #define LVARRAY_LOG( ... ) std::cout << __VA_ARGS__ << std::endl 110 #define LVARRAY_LOG_VAR( ... ) LVARRAY_LOG( STRINGIZE( __VA_ARGS__ ) << " = " << __VA_ARGS__ ) 123 #if defined(LVARRAY_DEVICE_COMPILE) 128 #if (!defined(NDEBUG)) || defined(__HIP_DEVICE_COMPILE__) 129 #define LVARRAY_ERROR_IF( EXP, MSG ) \ 134 assert( false && "EXP = " STRINGIZE( EXP ) "MSG = " STRINGIZE( MSG ) ); \ 138 #define LVARRAY_ERROR_IF( EXP, MSG ) \ 143 constexpr char const * formatString = "***** ERROR\n" \ 144 "***** LOCATION: " LOCATION "\n" \ 145 "***** Block: [%u, %u, %u]\n" \ 146 "***** Thread: [%u, %u, %u]\n" \ 147 "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n" \ 148 "***** MSG: " STRINGIZE( MSG ) "\n\n"; \ 149 printf( formatString, blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z ); \ 155 #define LVARRAY_ERROR_IF( EXP, MSG ) \ 160 std::ostringstream __oss; \ 161 __oss << "***** ERROR\n"; \ 162 __oss << "***** LOCATION: " LOCATION "\n"; \ 163 __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ 164 __oss << MSG << "\n"; \ 165 __oss << LvArray::system::stackTrace( true ); \ 166 std::cout << __oss.str() << std::endl; \ 167 LvArray::system::callErrorHandler(); \ 176 #define LVARRAY_ERROR( MSG ) LVARRAY_ERROR_IF( true, MSG ) 190 #define LVARRAY_ASSERT_MSG( EXP, MSG ) LVARRAY_ERROR_IF( !(EXP), MSG ) 192 #define LVARRAY_ASSERT_MSG( EXP, MSG ) ((void) 0) 201 #define LVARRAY_THROW_IF( EXP, MSG, TYPE ) \ 206 std::ostringstream __oss; \ 208 __oss << "***** LOCATION: " LOCATION "\n"; \ 209 __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ 210 __oss << MSG << "\n"; \ 211 __oss << LvArray::system::stackTrace( true ); \ 212 throw TYPE( __oss.str() ); \ 220 #define LVARRAY_THROW( MSG, TYPE ) LVARRAY_THROW_IF( true, MSG, TYPE ) 223 #define LVARRAY_ASSERT( EXP ) LVARRAY_ASSERT_MSG( EXP, "" ) 230 #define LVARRAY_WARNING_IF( EXP, MSG ) \ 235 std::ostringstream __oss; \ 236 __oss << "***** WARNING\n"; \ 237 __oss << "***** LOCATION: " LOCATION "\n"; \ 238 __oss << "***** Controlling expression (should be false): " STRINGIZE( EXP ) "\n"; \ 240 std::cout << __oss.str() << std::endl; \ 248 #define LVARRAY_WARNING( MSG ) LVARRAY_WARNING_IF( true, MSG ) 255 #define LVARRAY_INFO_IF( EXP, MSG ) \ 260 std::ostringstream __oss; \ 261 __oss << "***** INFO\n"; \ 262 __oss << "***** LOCATION: " LOCATION "\n"; \ 263 __oss << "***** Controlling expression: " STRINGIZE( EXP ) "\n"; \ 265 std::cout << __oss.str() << std::endl; \ 273 #define LVARRAY_INFO( msg ) LVARRAY_INFO_IF( true, msg ) 283 #define LVARRAY_ERROR_IF_OP_MSG( lhs, OP, NOP, rhs, msg ) \ 284 LVARRAY_ERROR_IF( lhs OP rhs, \ 286 "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ 287 " " << #lhs << " = " << lhs << "\n" << \ 288 " " << #rhs << " = " << rhs << "\n" ) 299 #define LVARRAY_THROW_IF_OP_MSG( lhs, OP, NOP, rhs, msg, TYPE ) \ 300 LVARRAY_THROW_IF( lhs OP rhs, \ 302 "Expected " << #lhs << " " << #NOP << " " << #rhs << "\n" << \ 303 " " << #lhs << " = " << lhs << "\n" << \ 304 " " << #rhs << " = " << rhs << "\n", TYPE ) 312 #define LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, ==, !=, rhs, msg ) 321 #define LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, ==, !=, rhs, msg, TYPE ) 328 #define LVARRAY_ERROR_IF_EQ( lhs, rhs ) LVARRAY_ERROR_IF_EQ_MSG( lhs, rhs, "" ) 336 #define LVARRAY_THROW_IF_EQ( lhs, rhs, TYPE ) LVARRAY_THROW_IF_EQ_MSG( lhs, rhs, "", TYPE ) 344 #define LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, !=, ==, rhs, msg ) 353 #define LVARRAY_THROW_IF_NE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, !=, ==, rhs, msg, TYPE ) 360 #define LVARRAY_ERROR_IF_NE( lhs, rhs ) LVARRAY_ERROR_IF_NE_MSG( lhs, rhs, "" ) 368 #define LVARRAY_THROW_IF_NE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_NE_MSG( lhs, rhs, "", TYPE ) 376 #define LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >, <=, rhs, msg ) 385 #define LVARRAY_THROW_IF_GT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >, <=, rhs, msg, TYPE ) 392 #define LVARRAY_ERROR_IF_GT( lhs, rhs ) LVARRAY_ERROR_IF_GT_MSG( lhs, rhs, "" ) 400 #define LVARRAY_THROW_IF_GT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GT_MSG( lhs, rhs, "", TYPE ) 408 #define LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, >=, <, rhs, msg ) 417 #define LVARRAY_THROW_IF_GE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, >=, <, rhs, msg, TYPE ) 424 #define LVARRAY_ERROR_IF_GE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) 432 #define LVARRAY_THROW_IF_GE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) 440 #define LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <, >=, rhs, msg ) 449 #define LVARRAY_THROW_IF_LT_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <, >=, rhs, msg, TYPE ) 456 #define LVARRAY_ERROR_IF_LT( lhs, rhs ) LVARRAY_ERROR_IF_LT_MSG( lhs, rhs, "" ) 464 #define LVARRAY_THROW_IF_LT( lhs, rhs, TYPE ) LVARRAY_THROW_IF_LT_MSG( lhs, rhs, "", TYPE ) 472 #define LVARRAY_ERROR_IF_LE_MSG( lhs, rhs, msg ) LVARRAY_ERROR_IF_OP_MSG( lhs, <=, >, rhs, msg ) 481 #define LVARRAY_THROW_IF_LE_MSG( lhs, rhs, msg, TYPE ) LVARRAY_THROW_IF_OP_MSG( lhs, <=, >, rhs, msg, TYPE ) 488 #define LVARRAY_ERROR_IF_LE( lhs, rhs ) LVARRAY_ERROR_IF_GE_MSG( lhs, rhs, "" ) 496 #define LVARRAY_THROW_IF_LE( lhs, rhs, TYPE ) LVARRAY_THROW_IF_GE_MSG( lhs, rhs, "", TYPE ) 505 #define LVARRAY_ASSERT_OP_MSG( lhs, OP, rhs, msg ) \ 506 LVARRAY_ASSERT_MSG( lhs OP rhs, \ 508 " " << #lhs << " = " << lhs << "\n" << \ 509 " " << #rhs << " = " << rhs << "\n" ) 517 #define LVARRAY_ASSERT_EQ_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, ==, rhs, msg ) 524 #define LVARRAY_ASSERT_EQ( lhs, rhs ) LVARRAY_ASSERT_EQ_MSG( lhs, rhs, "" ) 532 #define LVARRAY_ASSERT_NE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, !=, rhs, msg ) 539 #define LVARRAY_ASSERT_NE( lhs, rhs ) LVARRAY_ASSERT_NE_MSG( lhs, rhs, "" ) 547 #define LVARRAY_ASSERT_GT_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >, rhs, msg ) 554 #define LVARRAY_ASSERT_GT( lhs, rhs ) LVARRAY_ASSERT_GT_MSG( lhs, rhs, "" ) 562 #define LVARRAY_ASSERT_GE_MSG( lhs, rhs, msg ) LVARRAY_ASSERT_OP_MSG( lhs, >=, rhs, msg ) 569 #define LVARRAY_ASSERT_GE( lhs, rhs ) LVARRAY_ASSERT_GE_MSG( lhs, rhs, "" ) 571 #if defined(LVARRAY_DECORATE) 572 #define LVARRAY_HOST_DEVICE __host__ __device__ 575 #if defined( LVARRAY_USE_HIP ) 576 #define LVARRAY_HOST_DEVICE_HIP __host__ __device__ 579 #define LVARRAY_HOST_DEVICE_HIP 584 #define LVARRAY_DEVICE __device__ 593 #if defined(LVARRAY_USE_CUDA) 594 #define DISABLE_HD_WARNING _Pragma("hd_warning_disable") 596 #define DISABLE_HD_WARNING 599 #define LVARRAY_HOST_DEVICE 601 #define LVARRAY_HOST_DEVICE_HIP 605 #define LVARRAY_DEVICE 614 #define DISABLE_HD_WARNING 618 #if defined(__clang__) 619 #define LVARRAY_RESTRICT __restrict__ 620 #define LVARRAY_RESTRICT_REF __restrict__ 621 #define LVARRAY_INTEL_CONSTEXPR constexpr 622 #elif defined(__GNUC__) 623 #if defined(__INTEL_COMPILER) 624 #define LVARRAY_RESTRICT __restrict__ 625 #define LVARRAY_RESTRICT_REF __restrict__ 626 #define LVARRAY_INTEL_CONSTEXPR 628 #define LVARRAY_RESTRICT __restrict__ 629 #define LVARRAY_RESTRICT_REF __restrict__ 630 #define LVARRAY_INTEL_CONSTEXPR constexpr 634 #if !defined(LVARRAY_BOUNDS_CHECK) 638 #define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr 643 #define CONSTEXPR_WITHOUT_BOUNDS_CHECK 650 #define CONSTEXPR_WITH_NDEBUG constexpr 655 #define CONSTEXPR_WITH_NDEBUG 658 #if !defined(LVARRAY_BOUNDS_CHECK) 662 #define CONSTEXPR_WITHOUT_BOUNDS_CHECK constexpr 667 #define CONSTEXPR_WITHOUT_BOUNDS_CHECK 674 #define CONSTEXPR_WITH_NDEBUG constexpr 679 #define CONSTEXPR_WITH_NDEBUG 683 #include <RAJA/RAJA.hpp> 689 using serialPolicy = RAJA::loop_exec;
694 using ReducePolicy = RAJA::seq_reduce;
695 using AtomicPolicy = RAJA::seq_atomic;
698 #if defined(RAJA_ENABLE_OPENMP) 700 using parallelHostPolicy = RAJA::omp_parallel_for_exec;
705 using ReducePolicy = RAJA::omp_reduce;
706 using AtomicPolicy = RAJA::omp_atomic;
711 #if defined(LVARRAY_USE_CUDA) 713 template<
unsigned long THREADS_PER_BLOCK >
714 using parallelDevicePolicy = RAJA::cuda_exec< THREADS_PER_BLOCK >;
716 template<
unsigned long N >
719 using ReducePolicy = RAJA::cuda_reduce;
720 using AtomicPolicy = RAJA::cuda_atomic;
723 #elif defined(LVARRAY_USE_HIP) 725 template<
unsigned long THREADS_PER_BLOCK >
726 using parallelDevicePolicy = RAJA::hip_exec< THREADS_PER_BLOCK >;
728 template<
unsigned long N >
731 using ReducePolicy = RAJA::hip_reduce;
732 using AtomicPolicy = RAJA::hip_atomic;
Contains functions that interact with the system or runtime environment.
Definition: Macros.hpp:686