Index: libomptarget/deviceRTLs/nvptx/CMakeLists.txt =================================================================== --- libomptarget/deviceRTLs/nvptx/CMakeLists.txt +++ libomptarget/deviceRTLs/nvptx/CMakeLists.txt @@ -53,6 +53,7 @@ src/reduction.cu src/sync.cu src/task.cu + src/math.cu ) set(omp_data_objects src/omp_data.cu) Index: libomptarget/deviceRTLs/nvptx/src/interface.h =================================================================== --- libomptarget/deviceRTLs/nvptx/src/interface.h +++ libomptarget/deviceRTLs/nvptx/src/interface.h @@ -567,4 +567,31 @@ EXTERN void __kmpc_restore_team_static_memory(int16_t isSPMDExecutionMode, int16_t is_shared); +// POW +EXTERN float __kmpc_powf(float a, float b); +EXTERN double __kmpc_pow(double, double); +EXTERN long double __kmpc_powl(long double a, long double b); + +// LOG +EXTERN double __kmpc_log(double); +EXTERN float __kmpc_logf(float); +EXTERN double __kmpc_log10(double); +EXTERN float __kmpc_log10f(float); +EXTERN double __kmpc_log1p(double); +EXTERN float __kmpc_log1pf(float); +EXTERN double __kmpc_log2(double); +EXTERN float __kmpc_log2f(float); +EXTERN double __kmpc_logb(double); +EXTERN float __kmpc_logbf(float); + +// SIN +EXTERN float __kmpc_sinf(float); +EXTERN double __kmpc_sin(double); +EXTERN long double __kmpc_sinl(long double); + +// COS +EXTERN float __kmpc_cosf(float); +EXTERN double __kmpc_cos(double); +EXTERN long double __kmpc_cosl(long double); + #endif Index: libomptarget/deviceRTLs/nvptx/src/math.cu =================================================================== --- /dev/null +++ libomptarget/deviceRTLs/nvptx/src/math.cu @@ -0,0 +1,60 @@ +//===------------ math.cu - NVPTX OpenMP math constructs --------- CUDA -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains the implementation of math function not already handled. +// Function in this file will end up as part of the .bc library of the +// device and will call libdevice functions. +// +//===----------------------------------------------------------------------===// + +#include "omptarget-nvptx.h" + +// Single argument functions +#define __OPENMP_MATH_FUNC_1(__ty, __fn, __kmpc_fn) \ + EXTERN __ty __kmpc_fn(__ty __x) { \ + return __fn(__x); \ + } + +// Double argument functions +#define __OPENMP_MATH_FUNC_2(__ty, __fn, __kmpc_fn) \ + EXTERN __ty __kmpc_fn(__ty __x, __ty __y) { \ + return __fn(__x, __y); \ + } + +__OPENMP_MATH_FUNC_2(float, powf, __kmpc_powf); +__OPENMP_MATH_FUNC_2(double, pow, __kmpc_pow); +// no powl defined for the GPU device so use pow. +EXTERN long double __kmpc_powl(long double a, long double b) { + return pow((double) a, (double) b); +} + +// LOG +__OPENMP_MATH_FUNC_1(double, log, __kmpc_log); +__OPENMP_MATH_FUNC_1(float, logf, __kmpc_logf); +__OPENMP_MATH_FUNC_1(double, log10, __kmpc_log10); +__OPENMP_MATH_FUNC_1(float, log10f, __kmpc_log10f); +__OPENMP_MATH_FUNC_1(double, log1p, __kmpc_log1p); +__OPENMP_MATH_FUNC_1(float, log1pf, __kmpc_log1pf); +__OPENMP_MATH_FUNC_1(double, log2, __kmpc_log2); +__OPENMP_MATH_FUNC_1(float, log2f, __kmpc_log2f); +__OPENMP_MATH_FUNC_1(double, logb, __kmpc_logb); +__OPENMP_MATH_FUNC_1(float, logbf, __kmpc_logbf); + +__OPENMP_MATH_FUNC_1(float, sinf, __kmpc_sinf); +__OPENMP_MATH_FUNC_1(double, sin, __kmpc_sin); +// no sinl defined for the GPU device so use pow. +EXTERN long double __kmpc_sinl(long double a) { + return sin((double) a); +} + +// COS +__OPENMP_MATH_FUNC_1(float, cosf, __kmpc_cosf); +__OPENMP_MATH_FUNC_1(double, cos, __kmpc_cos); +EXTERN long double __kmpc_cosl(long double a) { + return cos((double) a); +} \ No newline at end of file