167ab875fSJohannes Doerfert //===--------- Misc.cpp - OpenMP device misc interfaces ----------- C++ -*-===//
267ab875fSJohannes Doerfert //
367ab875fSJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
467ab875fSJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
567ab875fSJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667ab875fSJohannes Doerfert //
767ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
867ab875fSJohannes Doerfert //
967ab875fSJohannes Doerfert //
1067ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
1167ab875fSJohannes Doerfert 
1267ab875fSJohannes Doerfert #include "Types.h"
1367ab875fSJohannes Doerfert 
1474f91741SJoseph Huber #include "Debug.h"
1574f91741SJoseph Huber 
16b4f8443dSJoseph Huber #pragma omp begin declare target device_type(nohost)
1767ab875fSJohannes Doerfert 
1867ab875fSJohannes Doerfert namespace _OMP {
1967ab875fSJohannes Doerfert namespace impl {
2067ab875fSJohannes Doerfert 
21b4f8443dSJoseph Huber double getWTick();
22b4f8443dSJoseph Huber 
23b4f8443dSJoseph Huber double getWTime();
24b4f8443dSJoseph Huber 
2567ab875fSJohannes Doerfert /// AMDGCN Implementation
2667ab875fSJohannes Doerfert ///
2767ab875fSJohannes Doerfert ///{
2867ab875fSJohannes Doerfert #pragma omp begin declare variant match(device = {arch(amdgcn)})
2967ab875fSJohannes Doerfert 
getWTick()3067ab875fSJohannes Doerfert double getWTick() { return ((double)1E-9); }
3167ab875fSJohannes Doerfert 
getWTime()3267ab875fSJohannes Doerfert double getWTime() {
3367ab875fSJohannes Doerfert   // The intrinsics for measuring time have undocumented frequency
3467ab875fSJohannes Doerfert   // This will probably need to be found by measurement on a number of
3567ab875fSJohannes Doerfert   // architectures. Until then, return 0, which is very inaccurate as a
3667ab875fSJohannes Doerfert   // timer but resolves the undefined symbol at link time.
3767ab875fSJohannes Doerfert   return 0;
3867ab875fSJohannes Doerfert }
3967ab875fSJohannes Doerfert 
4067ab875fSJohannes Doerfert #pragma omp end declare variant
4167ab875fSJohannes Doerfert 
4267ab875fSJohannes Doerfert /// NVPTX Implementation
4367ab875fSJohannes Doerfert ///
4467ab875fSJohannes Doerfert ///{
4567ab875fSJohannes Doerfert #pragma omp begin declare variant match(                                       \
4667ab875fSJohannes Doerfert     device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)})
4767ab875fSJohannes Doerfert 
getWTick()4867ab875fSJohannes Doerfert double getWTick() {
4967ab875fSJohannes Doerfert   // Timer precision is 1ns
5067ab875fSJohannes Doerfert   return ((double)1E-9);
5167ab875fSJohannes Doerfert }
5267ab875fSJohannes Doerfert 
getWTime()5367ab875fSJohannes Doerfert double getWTime() {
5467ab875fSJohannes Doerfert   unsigned long long nsecs;
55*602e0eb9SShilei Tian   asm volatile("mov.u64  %0, %%globaltimer;" : "=l"(nsecs));
5667ab875fSJohannes Doerfert   return (double)nsecs * getWTick();
5767ab875fSJohannes Doerfert }
5867ab875fSJohannes Doerfert 
5967ab875fSJohannes Doerfert #pragma omp end declare variant
6067ab875fSJohannes Doerfert 
6167ab875fSJohannes Doerfert } // namespace impl
6267ab875fSJohannes Doerfert } // namespace _OMP
6367ab875fSJohannes Doerfert 
6467ab875fSJohannes Doerfert /// Interfaces
6567ab875fSJohannes Doerfert ///
6667ab875fSJohannes Doerfert ///{
6767ab875fSJohannes Doerfert 
6867ab875fSJohannes Doerfert extern "C" {
__kmpc_cancellationpoint(IdentTy *,int32_t,int32_t)6974f91741SJoseph Huber int32_t __kmpc_cancellationpoint(IdentTy *, int32_t, int32_t) {
7074f91741SJoseph Huber   FunctionTracingRAII();
7174f91741SJoseph Huber   return 0;
7274f91741SJoseph Huber }
7367ab875fSJohannes Doerfert 
__kmpc_cancel(IdentTy *,int32_t,int32_t)7474f91741SJoseph Huber int32_t __kmpc_cancel(IdentTy *, int32_t, int32_t) {
7574f91741SJoseph Huber   FunctionTracingRAII();
7674f91741SJoseph Huber   return 0;
7774f91741SJoseph Huber }
7867ab875fSJohannes Doerfert 
omp_get_wtick(void)7967ab875fSJohannes Doerfert double omp_get_wtick(void) { return _OMP::impl::getWTick(); }
8067ab875fSJohannes Doerfert 
omp_get_wtime(void)8167ab875fSJohannes Doerfert double omp_get_wtime(void) { return _OMP::impl::getWTime(); }
8267ab875fSJohannes Doerfert }
8367ab875fSJohannes Doerfert 
8467ab875fSJohannes Doerfert ///}
8567ab875fSJohannes Doerfert #pragma omp end declare target
86