//===-- Generic utilities for GPU timing ----------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC_TIME_GPU_TIME_UTILS_H #define LLVM_LIBC_SRC_TIME_GPU_TIME_UTILS_H #include "hdr/time_macros.h" #include "hdr/types/clock_t.h" #include "src/__support/GPU/utils.h" #include "src/__support/macros/config.h" namespace LIBC_NAMESPACE_DECL { #if defined(LIBC_TARGET_ARCH_IS_AMDGPU) // AMDGPU does not have a single set frequency. Different architectures and // cards can have different values. The actualy frequency needs to be read from // the kernel driver and will be between 25 MHz and 100 MHz on most cards. All // cards following the GFX9 ISAs use a 100 MHz clock so we will default to that. constexpr uint64_t clock_freq = 100000000UL; // We provide an externally visible symbol such that the runtime can set // this to the correct value. extern "C" { [[gnu::visibility("protected")]] extern gpu::Constant __llvm_libc_clock_freq; } #define GPU_CLOCKS_PER_SEC static_cast(__llvm_libc_clock_freq) #elif defined(LIBC_TARGET_ARCH_IS_NVPTX) // NPVTX uses a single 1 GHz fixed frequency clock for all target architectures. #define GPU_CLOCKS_PER_SEC static_cast(1000000000UL) #else #error "Unsupported target" #endif } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC_TIME_GPU_TIME_UTILS_H