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 
14*74f91741SJoseph Huber #include "Debug.h"
15*74f91741SJoseph Huber 
1667ab875fSJohannes Doerfert #pragma omp declare target
1767ab875fSJohannes Doerfert 
1867ab875fSJohannes Doerfert namespace _OMP {
1967ab875fSJohannes Doerfert namespace impl {
2067ab875fSJohannes Doerfert 
2167ab875fSJohannes Doerfert /// AMDGCN Implementation
2267ab875fSJohannes Doerfert ///
2367ab875fSJohannes Doerfert ///{
2467ab875fSJohannes Doerfert #pragma omp begin declare variant match(device = {arch(amdgcn)})
2567ab875fSJohannes Doerfert 
2667ab875fSJohannes Doerfert double getWTick() { return ((double)1E-9); }
2767ab875fSJohannes Doerfert 
2867ab875fSJohannes Doerfert double getWTime() {
2967ab875fSJohannes Doerfert   // The intrinsics for measuring time have undocumented frequency
3067ab875fSJohannes Doerfert   // This will probably need to be found by measurement on a number of
3167ab875fSJohannes Doerfert   // architectures. Until then, return 0, which is very inaccurate as a
3267ab875fSJohannes Doerfert   // timer but resolves the undefined symbol at link time.
3367ab875fSJohannes Doerfert   return 0;
3467ab875fSJohannes Doerfert }
3567ab875fSJohannes Doerfert 
3667ab875fSJohannes Doerfert #pragma omp end declare variant
3767ab875fSJohannes Doerfert 
3867ab875fSJohannes Doerfert /// NVPTX Implementation
3967ab875fSJohannes Doerfert ///
4067ab875fSJohannes Doerfert ///{
4167ab875fSJohannes Doerfert #pragma omp begin declare variant match(                                       \
4267ab875fSJohannes Doerfert     device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)})
4367ab875fSJohannes Doerfert 
4467ab875fSJohannes Doerfert double getWTick() {
4567ab875fSJohannes Doerfert   // Timer precision is 1ns
4667ab875fSJohannes Doerfert   return ((double)1E-9);
4767ab875fSJohannes Doerfert }
4867ab875fSJohannes Doerfert 
4967ab875fSJohannes Doerfert double getWTime() {
5067ab875fSJohannes Doerfert   unsigned long long nsecs;
5167ab875fSJohannes Doerfert   asm("mov.u64  %0, %%globaltimer;" : "=l"(nsecs));
5267ab875fSJohannes Doerfert   return (double)nsecs * getWTick();
5367ab875fSJohannes Doerfert }
5467ab875fSJohannes Doerfert 
5567ab875fSJohannes Doerfert #pragma omp end declare variant
5667ab875fSJohannes Doerfert 
5767ab875fSJohannes Doerfert } // namespace impl
5867ab875fSJohannes Doerfert } // namespace _OMP
5967ab875fSJohannes Doerfert 
6067ab875fSJohannes Doerfert /// Interfaces
6167ab875fSJohannes Doerfert ///
6267ab875fSJohannes Doerfert ///{
6367ab875fSJohannes Doerfert 
6467ab875fSJohannes Doerfert extern "C" {
65*74f91741SJoseph Huber int32_t __kmpc_cancellationpoint(IdentTy *, int32_t, int32_t) {
66*74f91741SJoseph Huber   FunctionTracingRAII();
67*74f91741SJoseph Huber   return 0;
68*74f91741SJoseph Huber }
6967ab875fSJohannes Doerfert 
70*74f91741SJoseph Huber int32_t __kmpc_cancel(IdentTy *, int32_t, int32_t) {
71*74f91741SJoseph Huber   FunctionTracingRAII();
72*74f91741SJoseph Huber   return 0;
73*74f91741SJoseph Huber }
7467ab875fSJohannes Doerfert 
7567ab875fSJohannes Doerfert double omp_get_wtick(void) { return _OMP::impl::getWTick(); }
7667ab875fSJohannes Doerfert 
7767ab875fSJohannes Doerfert double omp_get_wtime(void) { return _OMP::impl::getWTime(); }
7867ab875fSJohannes Doerfert }
7967ab875fSJohannes Doerfert 
8067ab875fSJohannes Doerfert ///}
8167ab875fSJohannes Doerfert #pragma omp end declare target
82