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 16*b4f8443dSJoseph Huber #pragma omp begin declare target device_type(nohost) 1767ab875fSJohannes Doerfert 1867ab875fSJohannes Doerfert namespace _OMP { 1967ab875fSJohannes Doerfert namespace impl { 2067ab875fSJohannes Doerfert 21*b4f8443dSJoseph Huber double getWTick(); 22*b4f8443dSJoseph Huber 23*b4f8443dSJoseph Huber double getWTime(); 24*b4f8443dSJoseph Huber 2567ab875fSJohannes Doerfert /// AMDGCN Implementation 2667ab875fSJohannes Doerfert /// 2767ab875fSJohannes Doerfert ///{ 2867ab875fSJohannes Doerfert #pragma omp begin declare variant match(device = {arch(amdgcn)}) 2967ab875fSJohannes Doerfert 3067ab875fSJohannes Doerfert double getWTick() { return ((double)1E-9); } 3167ab875fSJohannes Doerfert 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 4867ab875fSJohannes Doerfert double getWTick() { 4967ab875fSJohannes Doerfert // Timer precision is 1ns 5067ab875fSJohannes Doerfert return ((double)1E-9); 5167ab875fSJohannes Doerfert } 5267ab875fSJohannes Doerfert 5367ab875fSJohannes Doerfert double getWTime() { 5467ab875fSJohannes Doerfert unsigned long long nsecs; 5567ab875fSJohannes Doerfert asm("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" { 6974f91741SJoseph Huber int32_t __kmpc_cancellationpoint(IdentTy *, int32_t, int32_t) { 7074f91741SJoseph Huber FunctionTracingRAII(); 7174f91741SJoseph Huber return 0; 7274f91741SJoseph Huber } 7367ab875fSJohannes Doerfert 7474f91741SJoseph Huber int32_t __kmpc_cancel(IdentTy *, int32_t, int32_t) { 7574f91741SJoseph Huber FunctionTracingRAII(); 7674f91741SJoseph Huber return 0; 7774f91741SJoseph Huber } 7867ab875fSJohannes Doerfert 7967ab875fSJohannes Doerfert double omp_get_wtick(void) { return _OMP::impl::getWTick(); } 8067ab875fSJohannes Doerfert 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