2021-01-11 18:16:03 +08:00
|
|
|
/****************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2020 Vivante Corporation
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
|
*
|
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
|
*
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
|
* DEALINGS IN THE SOFTWARE.
|
|
|
|
|
*
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#ifndef _VSI_NN_GPU_H
|
|
|
|
|
#define _VSI_NN_GPU_H
|
|
|
|
|
|
|
|
|
|
#include "vsi_nn_gpu_config.h"
|
|
|
|
|
|
|
|
|
|
#define gpu_min(x, y) (((x) <= (y)) ? (x) : (y))
|
|
|
|
|
|
|
|
|
|
#define gpu_max(x, y) (((x) >= (y)) ? (x) : (y))
|
|
|
|
|
|
|
|
|
|
#define gpu_postshift( x ) (gpu_min( x, GPU_MAX_POST_SHIFT_BITS))
|
|
|
|
|
#define gpu_multiplier( x ) (gpu_min( x, GPU_MAX_MULTIPLIER_NUM))
|
|
|
|
|
|
|
|
|
|
// Alignment with a power of two value.
|
|
|
|
|
#define gpu_align_np2(n, align) (((n) + (align) - 1) - (((n) + (align) - 1) % (align)))
|
|
|
|
|
|
|
|
|
|
#define gpu_align_np2_safe(n, align) \
|
|
|
|
|
( \
|
|
|
|
|
(gpu_align_np2((n) & ~0ULL, (align) & ~0ULL) ^ gpu_align_np2(n, align)) ? \
|
|
|
|
|
(n) : gpu_align_np2(n, align) \
|
|
|
|
|
)
|
|
|
|
|
#define gpu_align_p2(n, align) ((n) + ((align) - 1)) & ~((align) - 1)
|
|
|
|
|
|
|
|
|
|
#define GPU_MAX_DIMENSION_SIZE (3)
|
|
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
|
{
|
|
|
|
|
GPU_DP_TYPE_16,
|
|
|
|
|
GPU_DP_TYPE_32,
|
|
|
|
|
} gpu_dp_type_e;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
{
|
|
|
|
|
// 512 byte data
|
|
|
|
|
uint32_t data[16];
|
|
|
|
|
gpu_dp_type_e type;
|
|
|
|
|
} gpu_dp_inst_t;
|
|
|
|
|
|
2023-04-18 22:19:16 +08:00
|
|
|
typedef struct VSI_PUBLIC_TYPE
|
2021-01-11 18:16:03 +08:00
|
|
|
{
|
|
|
|
|
uint32_t dim;
|
|
|
|
|
size_t global_offset[GPU_MAX_DIMENSION_SIZE];
|
|
|
|
|
size_t global_scale[GPU_MAX_DIMENSION_SIZE];
|
|
|
|
|
size_t local_size[GPU_MAX_DIMENSION_SIZE];
|
|
|
|
|
size_t global_size[GPU_MAX_DIMENSION_SIZE];
|
|
|
|
|
} gpu_param_t;
|
|
|
|
|
|
|
|
|
|
void gpu_dp_inst_update_postshfit
|
|
|
|
|
(
|
|
|
|
|
gpu_dp_inst_t * dp_inst,
|
|
|
|
|
int32_t shift
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void gpu_dp_inst_update_multiplier
|
|
|
|
|
(
|
|
|
|
|
gpu_dp_inst_t * dp_inst,
|
|
|
|
|
int32_t start,
|
|
|
|
|
int32_t end,
|
|
|
|
|
int32_t multiplier
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void gpu_quantize_multiplier_16bit
|
|
|
|
|
(
|
|
|
|
|
double double_multipier,
|
|
|
|
|
uint16_t * quantize_multiplier,
|
|
|
|
|
int32_t * shift
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
void gpu_quantize_multiplier_32bit
|
|
|
|
|
(
|
|
|
|
|
double double_multipier,
|
|
|
|
|
uint32_t * quantize_multiplier,
|
|
|
|
|
int32_t * shift
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|