1*67ab875fSJohannes Doerfert //===--------- Misc.cpp - OpenMP device misc interfaces ----------- C++ -*-===//
2*67ab875fSJohannes Doerfert //
3*67ab875fSJohannes Doerfert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*67ab875fSJohannes Doerfert // See https://llvm.org/LICENSE.txt for license information.
5*67ab875fSJohannes Doerfert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*67ab875fSJohannes Doerfert //
7*67ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
8*67ab875fSJohannes Doerfert //
9*67ab875fSJohannes Doerfert //
10*67ab875fSJohannes Doerfert //===----------------------------------------------------------------------===//
11*67ab875fSJohannes Doerfert 
12*67ab875fSJohannes Doerfert #include "Types.h"
13*67ab875fSJohannes Doerfert 
14*67ab875fSJohannes Doerfert #pragma omp declare target
15*67ab875fSJohannes Doerfert 
16*67ab875fSJohannes Doerfert namespace _OMP {
17*67ab875fSJohannes Doerfert namespace impl {
18*67ab875fSJohannes Doerfert 
19*67ab875fSJohannes Doerfert /// AMDGCN Implementation
20*67ab875fSJohannes Doerfert ///
21*67ab875fSJohannes Doerfert ///{
22*67ab875fSJohannes Doerfert #pragma omp begin declare variant match(device = {arch(amdgcn)})
23*67ab875fSJohannes Doerfert 
24*67ab875fSJohannes Doerfert double getWTick() { return ((double)1E-9); }
25*67ab875fSJohannes Doerfert 
26*67ab875fSJohannes Doerfert double getWTime() {
27*67ab875fSJohannes Doerfert   // The intrinsics for measuring time have undocumented frequency
28*67ab875fSJohannes Doerfert   // This will probably need to be found by measurement on a number of
29*67ab875fSJohannes Doerfert   // architectures. Until then, return 0, which is very inaccurate as a
30*67ab875fSJohannes Doerfert   // timer but resolves the undefined symbol at link time.
31*67ab875fSJohannes Doerfert   return 0;
32*67ab875fSJohannes Doerfert }
33*67ab875fSJohannes Doerfert 
34*67ab875fSJohannes Doerfert #pragma omp end declare variant
35*67ab875fSJohannes Doerfert 
36*67ab875fSJohannes Doerfert /// NVPTX Implementation
37*67ab875fSJohannes Doerfert ///
38*67ab875fSJohannes Doerfert ///{
39*67ab875fSJohannes Doerfert #pragma omp begin declare variant match(                                       \
40*67ab875fSJohannes Doerfert     device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)})
41*67ab875fSJohannes Doerfert 
42*67ab875fSJohannes Doerfert double getWTick() {
43*67ab875fSJohannes Doerfert   // Timer precision is 1ns
44*67ab875fSJohannes Doerfert   return ((double)1E-9);
45*67ab875fSJohannes Doerfert }
46*67ab875fSJohannes Doerfert 
47*67ab875fSJohannes Doerfert double getWTime() {
48*67ab875fSJohannes Doerfert   unsigned long long nsecs;
49*67ab875fSJohannes Doerfert   asm("mov.u64  %0, %%globaltimer;" : "=l"(nsecs));
50*67ab875fSJohannes Doerfert   return (double)nsecs * getWTick();
51*67ab875fSJohannes Doerfert }
52*67ab875fSJohannes Doerfert 
53*67ab875fSJohannes Doerfert #pragma omp end declare variant
54*67ab875fSJohannes Doerfert 
55*67ab875fSJohannes Doerfert } // namespace impl
56*67ab875fSJohannes Doerfert } // namespace _OMP
57*67ab875fSJohannes Doerfert 
58*67ab875fSJohannes Doerfert /// Interfaces
59*67ab875fSJohannes Doerfert ///
60*67ab875fSJohannes Doerfert ///{
61*67ab875fSJohannes Doerfert 
62*67ab875fSJohannes Doerfert extern "C" {
63*67ab875fSJohannes Doerfert int32_t __kmpc_cancellationpoint(IdentTy *, int32_t, int32_t) { return 0; }
64*67ab875fSJohannes Doerfert 
65*67ab875fSJohannes Doerfert int32_t __kmpc_cancel(IdentTy *, int32_t, int32_t) { return 0; }
66*67ab875fSJohannes Doerfert 
67*67ab875fSJohannes Doerfert double omp_get_wtick(void) { return _OMP::impl::getWTick(); }
68*67ab875fSJohannes Doerfert 
69*67ab875fSJohannes Doerfert double omp_get_wtime(void) { return _OMP::impl::getWTime(); }
70*67ab875fSJohannes Doerfert }
71*67ab875fSJohannes Doerfert 
72*67ab875fSJohannes Doerfert ///}
73*67ab875fSJohannes Doerfert #pragma omp end declare target
74