|
- /**
- * Copyright 2020 Huawei Technologies Co., Ltd
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- #include "fp16_math.h"
- #include "external/register/register_types.h"
-
- namespace ge {
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t sqrt(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number square root
- double dSqrt = std::sqrt(dVal);
- // calculate result
- ret = dSqrt;
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t rsqrt(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number square root and reciprocal
- double drSqrt = 1.0 / std::sqrt(dVal);
- // calculate result
- ret = drSqrt;
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t rcp(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number reciprocal
- double dRcp = 1.0 / dVal;
- // calculate result
- ret = dRcp;
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t exp(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number exponential
- double dExp = std::exp(dVal);
- // calculate result
- ret = dExp;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t pow2(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number binary exponential
- double dExp2 = std::pow(kDim2, dVal);
- // calculate result
- ret = dExp2;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t pow10(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number decimal exponential
- double dExp10 = std::pow(kDim10, dVal);
- // calculate result
- ret = dExp10;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t ln(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number natural logarithm
- double dLn = std::log(dVal);
- // calculate result
- ret = dLn;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t log2(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number binary logarithm
- double dLog2 = std::log2(dVal);
- // calculate result
- ret = dLog2;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t log10(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number binary logarithm
- double dLog10 = std::log10(dVal);
- // calculate result
- ret = dLog10;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t cos(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number cos
- double dCos = std::cos(dVal);
- // calculate result
- ret = dCos;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t sin(fp16_t fp) {
- fp16_t ret;
- // Convert half precision float number to double
- double dVal = fp;
- // Calculate double number sine
- double dSin = std::sin(dVal);
- // calculate result
- ret = dSin;
-
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t abs(fp16_t fp) {
- fp16_t ret;
- ret.val = (fp.val & kFp16AbsMax);
- return ret;
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t max(fp16_t fp1, fp16_t fp2) {
- if (fp1 >= fp2) {
- return fp1;
- } else {
- return fp2;
- }
- }
-
- FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY fp16_t min(fp16_t fp1, fp16_t fp2) {
- if (fp1 <= fp2) {
- return fp1;
- } else {
- return fp2;
- }
- }
- } // namespace ge
|