Spaces:
Sleeping
Sleeping
/*************************************************************************************************** | |
* Copyright (c) 2023 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
* SPDX-License-Identifier: BSD-3-Clause | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are met: | |
* | |
* 1. Redistributions of source code must retain the above copyright notice, this | |
* list of conditions and the following disclaimer. | |
* | |
* 2. 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. | |
* | |
* 3. Neither the name of the copyright holder nor the names of its | |
* contributors may be used to endorse or promote products derived from | |
* this software without specific prior written permission. | |
* | |
* 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
**************************************************************************************************/ | |
/** | |
* \file | |
* \brief Debugging and logging functionality | |
*/ | |
namespace cute | |
{ | |
/****************************************************************************** | |
* Debug and logging macros | |
******************************************************************************/ | |
/** | |
* Formats and prints the given message to stdout | |
*/ | |
printf("[block (%d,%d,%d), thread (%d,%d,%d)]: " format, \ | |
blockIdx.x, blockIdx.y, blockIdx.z, \ | |
threadIdx.x, threadIdx.y, threadIdx.z, \ | |
__VA_ARGS__); | |
/** | |
* Formats and prints the given message to stdout only if DEBUG is defined | |
*/ | |
/** | |
* \brief Perror macro with exit | |
*/ | |
do { \ | |
cudaError_t code = (e); \ | |
if (code != cudaSuccess) { \ | |
fprintf(stderr, "<%s:%d> %s:\n %s: %s\n", \ | |
__FILE__, __LINE__, | |
cudaGetErrorName(code), cudaGetErrorString(code)); \ | |
fflush(stderr); \ | |
exit(1); \ | |
} \ | |
} while (0) | |
// A dummy function that uses compilation failure to print a type | |
template <class... T> | |
CUTE_HOST_DEVICE void | |
print_type() { | |
static_assert(sizeof...(T) < 0, "Printing type T."); | |
} | |
template <class... T> | |
CUTE_HOST_DEVICE void | |
print_type(T&&...) { | |
static_assert(sizeof...(T) < 0, "Printing type T."); | |
} | |
// | |
// Device-specific helpers | |
// | |
// e.g. | |
// if (thread0()) print(...); | |
// if (block0()) print(...); | |
// if (thread(42)) print(...); | |
CUTE_HOST_DEVICE | |
bool | |
block(int bid) | |
{ | |
return blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y == bid; | |
return true; | |
} | |
CUTE_HOST_DEVICE | |
bool | |
thread(int tid, int bid) | |
{ | |
return (threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y == tid) && block(bid); | |
return true; | |
} | |
CUTE_HOST_DEVICE | |
bool | |
thread(int tid) | |
{ | |
return thread(tid,0); | |
} | |
CUTE_HOST_DEVICE | |
bool | |
thread0() | |
{ | |
return thread(0,0); | |
} | |
CUTE_HOST_DEVICE | |
bool | |
block0() | |
{ | |
return block(0); | |
} | |
} // end namespace cute | |