Summary: This patch starts adding support for adding information dumps to libomptarget and rtl plugins. The information printing is controlled by the LIBOMPTARGET_INFO environment variable introduced in D86483. The goal of this patch is to provide the user with additional information about the device during kernel execution and providing the user with information dumps in the case of failure. This patch added the ability to dump the pointer mapping table as well as printing the number of blocks and threads in the cuda RTL. Reviewers: jdoerfort gkistanova ye-luo Subscribers: guansong openmp-commits sstefan1 yaxunl ye-luo Tags: #OpenMP Differential Revision: https://reviews.llvm.org/D87165
160 lines
7.1 KiB
C++
160 lines
7.1 KiB
C++
//===------- Debug.h - Target independent OpenMP target RTL -- C++ --------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Routines used to provide debug messages and information from libomptarget
|
|
// and plugin RTLs to the user.
|
|
//
|
|
// Each plugin RTL and libomptarget define TARGET_NAME and DEBUG_PREFIX for use
|
|
// when sending messages to the user. These indicate which RTL sent the message
|
|
//
|
|
// Debug and information messages are controlled by the environment variables
|
|
// LIBOMPTARGET_DEBUG and LIBOMPTARGET_INFO which is set upon initialization
|
|
// of libomptarget or the plugin RTL.
|
|
//
|
|
// To printf a pointer in hex with a fixed width of 16 digits and a leading 0x,
|
|
// use printf("ptr=" DPxMOD "...\n", DPxPTR(ptr));
|
|
//
|
|
// DPxMOD expands to:
|
|
// "0x%0*" PRIxPTR
|
|
// where PRIxPTR expands to an appropriate modifier for the type uintptr_t on a
|
|
// specific platform, e.g. "lu" if uintptr_t is typedef'd as unsigned long:
|
|
// "0x%0*lu"
|
|
//
|
|
// Ultimately, the whole statement expands to:
|
|
// printf("ptr=0x%0*lu...\n", // the 0* modifier expects an extra argument
|
|
// // specifying the width of the output
|
|
// (int)(2*sizeof(uintptr_t)), // the extra argument specifying the width
|
|
// // 8 digits for 32bit systems
|
|
// // 16 digits for 64bit
|
|
// (uintptr_t) ptr);
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef _OMPTARGET_DEBUG_H
|
|
#define _OMPTARGET_DEBUG_H
|
|
|
|
static inline int getInfoLevel() {
|
|
static int InfoLevel = -1;
|
|
if (InfoLevel >= 0)
|
|
return InfoLevel;
|
|
|
|
if (char *EnvStr = getenv("LIBOMPTARGET_INFO"))
|
|
InfoLevel = std::stoi(EnvStr);
|
|
|
|
return InfoLevel;
|
|
}
|
|
|
|
static inline int getDebugLevel() {
|
|
static int DebugLevel = -1;
|
|
if (DebugLevel >= 0)
|
|
return DebugLevel;
|
|
|
|
if (char *EnvStr = getenv("LIBOMPTARGET_DEBUG"))
|
|
DebugLevel = std::stoi(EnvStr);
|
|
|
|
return DebugLevel;
|
|
}
|
|
|
|
#ifndef __STDC_FORMAT_MACROS
|
|
#define __STDC_FORMAT_MACROS
|
|
#endif
|
|
#include <inttypes.h>
|
|
#undef __STDC_FORMAT_MACROS
|
|
|
|
#define DPxMOD "0x%0*" PRIxPTR
|
|
#define DPxPTR(ptr) ((int)(2 * sizeof(uintptr_t))), ((uintptr_t)(ptr))
|
|
#define GETNAME2(name) #name
|
|
#define GETNAME(name) GETNAME2(name)
|
|
|
|
/// Print a generic message string from libomptarget or a plugin RTL
|
|
#define MESSAGE0(_str) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " message: %s\n", _str); \
|
|
} while (0)
|
|
|
|
/// Print a printf formatting string message from libomptarget or a plugin RTL
|
|
#define MESSAGE(_str, ...) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " message: " _str "\n", __VA_ARGS__); \
|
|
} while (0)
|
|
|
|
/// Print fatal error message with an error string and error identifier
|
|
#define FATAL_MESSAGE0(_num, _str) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " fatal error %d: %s\n", _num, _str); \
|
|
abort(); \
|
|
} while (0)
|
|
|
|
/// Print fatal error message with a printf string and error identifier
|
|
#define FATAL_MESSAGE(_num, _str, ...) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " fatal error %d:" _str "\n", _num, \
|
|
__VA_ARGS__); \
|
|
abort(); \
|
|
} while (0)
|
|
|
|
/// Print a generic error string from libomptarget or a plugin RTL
|
|
#define FAILURE_MESSAGE(...) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " error: "); \
|
|
fprintf(stderr, __VA_ARGS__); \
|
|
} while (0)
|
|
|
|
/// Print a generic information string used if LIBOMPTARGET_INFO=1
|
|
#define INFO_MESSAGE(_num, ...) \
|
|
do { \
|
|
fprintf(stderr, GETNAME(TARGET_NAME) " device %d info: ", _num); \
|
|
fprintf(stderr, __VA_ARGS__); \
|
|
} while (0)
|
|
|
|
// Debugging messages
|
|
#ifdef OMPTARGET_DEBUG
|
|
#include <stdio.h>
|
|
|
|
#define DEBUGP(prefix, ...) \
|
|
{ \
|
|
fprintf(stderr, "%s --> ", prefix); \
|
|
fprintf(stderr, __VA_ARGS__); \
|
|
}
|
|
|
|
/// Emit a message for debugging
|
|
#define DP(...) \
|
|
do { \
|
|
if (getDebugLevel() > 0) { \
|
|
DEBUGP(DEBUG_PREFIX, __VA_ARGS__); \
|
|
} \
|
|
} while (false)
|
|
|
|
/// Emit a message for debugging or failure if debugging is disabled
|
|
#define REPORT(...) \
|
|
do { \
|
|
if (getDebugLevel() > 0) { \
|
|
DP(__VA_ARGS__); \
|
|
} else { \
|
|
FAILURE_MESSAGE(__VA_ARGS__); \
|
|
} \
|
|
} while (false)
|
|
#else
|
|
#define DEBUGP(prefix, ...) \
|
|
{}
|
|
#define DP(...) \
|
|
{}
|
|
#define REPORT(...) FAILURE_MESSAGE(__VA_ARGS__);
|
|
#endif // OMPTARGET_DEBUG
|
|
|
|
/// Emit a message giving the user extra information about the runtime if
|
|
#define INFO(_id, ...) \
|
|
do { \
|
|
if (getDebugLevel() > 0) { \
|
|
DEBUGP(DEBUG_PREFIX, __VA_ARGS__); \
|
|
} else if (getInfoLevel() > 0) { \
|
|
INFO_MESSAGE(_id, __VA_ARGS__); \
|
|
} \
|
|
} while (false)
|
|
|
|
#endif // _OMPTARGET_DEBUG_H
|