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