xref: /aosp_15_r20/external/llvm-libc/src/time/gpu/clock.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- GPU implementation of the clock function --------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/time/clock.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/time/gpu/time_utils.h"
12*71db0c75SAndroid Build Coastguard Worker 
13*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
14*71db0c75SAndroid Build Coastguard Worker 
15*71db0c75SAndroid Build Coastguard Worker LLVM_LIBC_FUNCTION(clock_t, clock, ()) {
16*71db0c75SAndroid Build Coastguard Worker   if (!GPU_CLOCKS_PER_SEC)
17*71db0c75SAndroid Build Coastguard Worker     return clock_t(0);
18*71db0c75SAndroid Build Coastguard Worker 
19*71db0c75SAndroid Build Coastguard Worker   uint64_t ticks = gpu::fixed_frequency_clock();
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker   // We need to convert between the GPU's fixed frequency and whatever `time.h`
22*71db0c75SAndroid Build Coastguard Worker   // declares it to be. This is done so that dividing the result of this
23*71db0c75SAndroid Build Coastguard Worker   // function by 'CLOCKS_PER_SEC' yields the elapsed time.
24*71db0c75SAndroid Build Coastguard Worker   if (GPU_CLOCKS_PER_SEC > CLOCKS_PER_SEC)
25*71db0c75SAndroid Build Coastguard Worker     return clock_t(ticks / (GPU_CLOCKS_PER_SEC / CLOCKS_PER_SEC));
26*71db0c75SAndroid Build Coastguard Worker   return clock_t(ticks * (CLOCKS_PER_SEC / GPU_CLOCKS_PER_SEC));
27*71db0c75SAndroid Build Coastguard Worker }
28*71db0c75SAndroid Build Coastguard Worker 
29*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
30