cutlass/cutlass/util/debug.h

123 lines
4.3 KiB
C
Raw Normal View History

2018-05-17 02:44:56 +08:00
/***************************************************************************************************
* Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
2017-12-06 23:00:59 +08:00
*
2018-05-17 02:44:56 +08:00
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* * Neither the name of the NVIDIA CORPORATION nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
2017-12-06 23:00:59 +08:00
*
2018-05-17 02:44:56 +08:00
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2017-12-05 13:12:52 +08:00
*
2018-05-17 02:44:56 +08:00
**************************************************************************************************/
2017-12-05 13:12:52 +08:00
#pragma once
/**
* \file
* \brief Debugging and logging functionality
*/
#include <stdio.h>
namespace cutlass {
/******************************************************************************
* Debug and logging macros
******************************************************************************/
/**
* Formats and prints the given message to stdout
*/
#if !defined(CUDA_LOG)
2018-05-17 02:44:56 +08:00
#if !defined(__CUDA_ARCH__)
#define CUDA_LOG(format, ...) printf(format, __VA_ARGS__)
#else
#define CUDA_LOG(format, ...) \
printf("[block (%d,%d,%d), thread (%d,%d,%d)]: " format, \
blockIdx.x, \
blockIdx.y, \
blockIdx.z, \
threadIdx.x, \
threadIdx.y, \
threadIdx.z, \
__VA_ARGS__);
#endif
2017-12-05 13:12:52 +08:00
#endif
/**
* Formats and prints the given message to stdout only if DEBUG is defined
*/
#if !defined(CUDA_LOG_DEBUG)
2018-05-17 02:44:56 +08:00
#ifdef DEBUG
#define CUDA_LOG_DEBUG(format, ...) CUDA_LOG(format, __VA_ARGS__)
#else
#define CUDA_LOG_DEBUG(format, ...)
#endif
2017-12-05 13:12:52 +08:00
#endif
/**
2018-05-17 02:44:56 +08:00
* \brief The corresponding error message is printed to \p stderr (or \p stdout in device code)
* along with the supplied source context.
2017-12-05 13:12:52 +08:00
*
* \return The CUDA error.
*/
2018-05-17 02:44:56 +08:00
__host__ CUTLASS_DEVICE cudaError_t cuda_perror_impl(cudaError_t error,
const char* filename,
int line) {
(void)filename;
(void)line;
if (error) {
2017-12-05 13:12:52 +08:00
#if !defined(__CUDA_ARCH__)
2018-05-17 02:44:56 +08:00
fprintf(
stderr, "CUDA error %d [%s, %d]: %s\n", error, filename, line, cudaGetErrorString(error));
fflush(stderr);
2017-12-05 13:12:52 +08:00
#else
2018-05-17 02:44:56 +08:00
printf("CUDA error %d [%s, %d]\n", error, filename, line);
2017-12-05 13:12:52 +08:00
#endif
2018-05-17 02:44:56 +08:00
}
return error;
2017-12-05 13:12:52 +08:00
}
/**
* \brief Perror macro
*/
#ifndef CUDA_PERROR
2018-05-17 02:44:56 +08:00
#define CUDA_PERROR(e) cuda_perror_impl((cudaError_t)(e), __FILE__, __LINE__)
2017-12-05 13:12:52 +08:00
#endif
/**
* \brief Perror macro with exit
*/
#ifndef CUDA_PERROR_EXIT
2018-05-17 02:44:56 +08:00
#define CUDA_PERROR_EXIT(e) \
if (cuda_perror_impl((cudaError_t)(e), __FILE__, __LINE__)) { \
exit(1); \
}
2017-12-05 13:12:52 +08:00
#endif
/**
* \brief Perror macro only if DEBUG is defined
*/
#ifndef CUDA_PERROR_DEBUG
2018-05-17 02:44:56 +08:00
#ifdef DEBUG
#define CUDA_PERROR_DEBUG(e) CUDA_PERROR(e)
#else
#define CUDA_PERROR_DEBUG(e) (e)
#endif
2017-12-05 13:12:52 +08:00
#endif
2018-05-17 02:44:56 +08:00
} // namespace cutlass