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