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