forked from OSchip/llvm-project
294 lines
11 KiB
C++
294 lines
11 KiB
C++
//===------------- debug.h - NVPTX OpenMP debug macros ----------- CUDA -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains debug macros to be used in the application.
|
|
//
|
|
// Usage guide
|
|
//
|
|
// PRINT0(flag, str) : if debug flag is on, print (no arguments)
|
|
// PRINT(flag, str, args) : if debug flag is on, print (arguments)
|
|
// DON(flag) : return true if debug flag is on
|
|
//
|
|
// ASSERT(flag, cond, str, args): if test flag is on, test the condition
|
|
// if the condition is false, print str+args
|
|
// and assert.
|
|
// CAUTION: cond may be evaluate twice
|
|
// AON(flag) : return true if test flag is on
|
|
//
|
|
// WARNING(flag, str, args) : if warning flag is on, print the warning
|
|
// WON(flag) : return true if warning flag is on
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _OMPTARGET_NVPTX_DEBUG_H_
|
|
#define _OMPTARGET_NVPTX_DEBUG_H_
|
|
|
|
#include "target_interface.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set desired level of debugging
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define LD_SET_NONE 0ULL /* none */
|
|
#define LD_SET_ALL -1ULL /* all */
|
|
|
|
// pos 1
|
|
#define LD_SET_LOOP 0x1ULL /* basic loop */
|
|
#define LD_SET_LOOPD 0x2ULL /* basic loop */
|
|
#define LD_SET_PAR 0x4ULL /* basic parallel */
|
|
#define LD_SET_PARD 0x8ULL /* basic parallel */
|
|
|
|
// pos 2
|
|
#define LD_SET_SYNC 0x10ULL /* sync info */
|
|
#define LD_SET_SYNCD 0x20ULL /* sync info */
|
|
#define LD_SET_WAIT 0x40ULL /* state when waiting */
|
|
#define LD_SET_TASK 0x80ULL /* print task info (high level) */
|
|
|
|
// pos 3
|
|
#define LD_SET_IO 0x100ULL /* big region io (excl atomic) */
|
|
#define LD_SET_IOD 0x200ULL /* big region io (excl atomic) */
|
|
#define LD_SET_ENV 0x400ULL /* env info */
|
|
#define LD_SET_CANCEL 0x800ULL /* print cancel info */
|
|
|
|
// pos 4
|
|
#define LD_SET_MEM 0x1000ULL /* malloc / free */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set the desired flags to print selected output.
|
|
|
|
// these are some examples of possible definitions that can be used for
|
|
// debugging.
|
|
//#define OMPTARGET_NVPTX_DEBUG (LD_SET_ALL)
|
|
//#define OMPTARGET_NVPTX_DEBUG (LD_SET_LOOP) // limit to loop printfs to save
|
|
// on cuda buffer
|
|
//#define OMPTARGET_NVPTX_DEBUG (LD_SET_IO)
|
|
//#define OMPTARGET_NVPTX_DEBUG (LD_SET_IO | LD_SET_ENV)
|
|
//#define OMPTARGET_NVPTX_DEBUG (LD_SET_PAR)
|
|
|
|
#ifndef OMPTARGET_NVPTX_DEBUG
|
|
#define OMPTARGET_NVPTX_DEBUG LD_SET_NONE
|
|
#elif OMPTARGET_NVPTX_DEBUG
|
|
#warning debug is used, not good for measurements
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set desired level of asserts
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// available flags
|
|
|
|
#define LT_SET_NONE 0x0 /* unsafe */
|
|
#define LT_SET_SAFETY \
|
|
0x1 /* check malloc type of stuff, input at creation, cheap */
|
|
#define LT_SET_INPUT 0x2 /* check also all runtime inputs */
|
|
#define LT_SET_FUSSY 0x4 /* fussy checks, expensive */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set the desired flags
|
|
|
|
#ifndef OMPTARGET_NVPTX_TEST
|
|
#if OMPTARGET_NVPTX_DEBUG
|
|
#define OMPTARGET_NVPTX_TEST (LT_SET_FUSSY)
|
|
#else
|
|
#define OMPTARGET_NVPTX_TEST (LT_SET_SAFETY)
|
|
#endif
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set desired level of warnings
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// available flags
|
|
|
|
#define LW_SET_ALL -1
|
|
#define LW_SET_NONE 0x0
|
|
#define LW_SET_ENV 0x1
|
|
#define LW_SET_INPUT 0x2
|
|
#define LW_SET_FUSSY 0x4
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// set the desired flags
|
|
|
|
#if OMPTARGET_NVPTX_DEBUG
|
|
#define OMPTARGET_NVPTX_WARNING (LW_SET_NONE)
|
|
#else
|
|
#define OMPTARGET_NVPTX_WARNING (LW_SET_FUSSY)
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// implementation for debug
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if OMPTARGET_NVPTX_DEBUG || OMPTARGET_NVPTX_TEST || OMPTARGET_NVPTX_WARNING
|
|
#include "common/support.h"
|
|
|
|
template <typename... Arguments>
|
|
NOINLINE static void log(const char *fmt, Arguments... parameters) {
|
|
printf(fmt, (int)GetBlockIdInKernel(),
|
|
(int)__kmpc_get_hardware_thread_id_in_block(), (int)GetWarpId(),
|
|
(int)GetLaneId(), parameters...);
|
|
}
|
|
|
|
#endif
|
|
#if OMPTARGET_NVPTX_TEST
|
|
|
|
template <typename... Arguments>
|
|
NOINLINE static void check(bool cond, const char *fmt,
|
|
Arguments... parameters) {
|
|
if (!cond) {
|
|
printf(fmt, (int)GetBlockIdInKernel(),
|
|
(int)__kmpc_get_hardware_thread_id_in_block(), (int)GetWarpId(),
|
|
(int)GetLaneId(), parameters...);
|
|
__builtin_trap();
|
|
}
|
|
}
|
|
|
|
NOINLINE static void check(bool cond) {
|
|
if (!cond)
|
|
__builtin_trap();
|
|
}
|
|
#endif
|
|
|
|
// set flags that are tested (inclusion properties)
|
|
|
|
#define LD_ALL (LD_SET_ALL)
|
|
|
|
#define LD_LOOP (LD_SET_LOOP | LD_SET_LOOPD)
|
|
#define LD_LOOPD (LD_SET_LOOPD)
|
|
#define LD_PAR (LD_SET_PAR | LD_SET_PARD)
|
|
#define LD_PARD (LD_SET_PARD)
|
|
|
|
// pos 2
|
|
#define LD_SYNC (LD_SET_SYNC | LD_SET_SYNCD)
|
|
#define LD_SYNCD (LD_SET_SYNCD)
|
|
#define LD_WAIT (LD_SET_WAIT)
|
|
#define LD_TASK (LD_SET_TASK)
|
|
|
|
// pos 3
|
|
#define LD_IO (LD_SET_IO | LD_SET_IOD)
|
|
#define LD_IOD (LD_SET_IOD)
|
|
#define LD_ENV (LD_SET_ENV)
|
|
#define LD_CANCEL (LD_SET_CANCEL)
|
|
|
|
// pos 3
|
|
#define LD_MEM (LD_SET_MEM)
|
|
|
|
// implement
|
|
#if OMPTARGET_NVPTX_DEBUG
|
|
|
|
#define DON(_flag) ((unsigned)(OMPTARGET_NVPTX_DEBUG) & (_flag))
|
|
|
|
#define PRINT0(_flag, _str) \
|
|
{ \
|
|
if (omptarget_device_environment.debug_level && DON(_flag)) { \
|
|
log("<b %2d, t %4d, w %2d, l %2d>: " _str); \
|
|
} \
|
|
}
|
|
|
|
#define PRINT(_flag, _str, _args...) \
|
|
{ \
|
|
if (omptarget_device_environment.debug_level && DON(_flag)) { \
|
|
log("<b %2d, t %4d, w %2d, l %2d>: " _str, _args); \
|
|
} \
|
|
}
|
|
#else
|
|
|
|
#define DON(_flag) (0)
|
|
#define PRINT0(flag, str)
|
|
#define PRINT(flag, str, _args...)
|
|
|
|
#endif
|
|
|
|
// for printing without worrying about precision, pointers...
|
|
#define P64(_x) ((unsigned long long)(_x))
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// early defs for test
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define LT_SAFETY (LT_SET_SAFETY | LT_SET_INPUT | LT_SET_FUSSY)
|
|
#define LT_INPUT (LT_SET_INPUT | LT_SET_FUSSY)
|
|
#define LT_FUSSY (LT_SET_FUSSY)
|
|
|
|
#if OMPTARGET_NVPTX_TEST == LT_SET_SAFETY
|
|
|
|
#define TON(_flag) ((OMPTARGET_NVPTX_TEST) & (_flag))
|
|
#define ASSERT0(_flag, _cond, _str) \
|
|
{ \
|
|
if (TON(_flag)) { \
|
|
check(_cond); \
|
|
} \
|
|
}
|
|
#define ASSERT(_flag, _cond, _str, _args...) \
|
|
{ \
|
|
if (TON(_flag)) { \
|
|
check(_cond); \
|
|
} \
|
|
}
|
|
|
|
#elif OMPTARGET_NVPTX_TEST >= LT_SET_INPUT
|
|
|
|
#define TON(_flag) ((OMPTARGET_NVPTX_TEST) & (_flag))
|
|
#define ASSERT0(_flag, _cond, _str) \
|
|
{ \
|
|
if (TON(_flag)) { \
|
|
check((_cond), "<b %3d, t %4d, w %2d, l %2d> ASSERT: " _str "\n"); \
|
|
} \
|
|
}
|
|
#define ASSERT(_flag, _cond, _str, _args...) \
|
|
{ \
|
|
if (TON(_flag)) { \
|
|
check((_cond), "<b %3d, t %4d, w %2d, l %d2> ASSERT: " _str "\n", \
|
|
_args); \
|
|
} \
|
|
}
|
|
|
|
#else
|
|
|
|
#define TON(_flag) (0)
|
|
#define ASSERT0(_flag, _cond, _str)
|
|
#define ASSERT(_flag, _cond, _str, _args...)
|
|
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// early defs for warning
|
|
|
|
#define LW_ALL (LW_SET_ALL)
|
|
#define LW_ENV (LW_SET_FUSSY | LW_SET_INPUT | LW_SET_ENV)
|
|
#define LW_INPUT (LW_SET_FUSSY | LW_SET_INPUT)
|
|
#define LW_FUSSY (LW_SET_FUSSY)
|
|
|
|
#if OMPTARGET_NVPTX_WARNING
|
|
|
|
#define WON(_flag) ((OMPTARGET_NVPTX_WARNING) & (_flag))
|
|
#define WARNING0(_flag, _str) \
|
|
{ \
|
|
if (WON(_flag)) { \
|
|
log("<b %2d, t %4d, w %2d, l %2d> WARNING: " _str); \
|
|
} \
|
|
}
|
|
#define WARNING(_flag, _str, _args...) \
|
|
{ \
|
|
if (WON(_flag)) { \
|
|
log("<b %2d, t %4d, w %2d, l %2d> WARNING: " _str, _args); \
|
|
} \
|
|
}
|
|
|
|
#else
|
|
|
|
#define WON(_flag) (0)
|
|
#define WARNING0(_flag, _str)
|
|
#define WARNING(_flag, _str, _args...)
|
|
|
|
#endif
|
|
|
|
#endif
|