[Internal] support prebuilt kernel into shared library (#260)

Signed-off-by: xiang.zhang <xiang.zhang@verisilicon.com>
This commit is contained in:
Sven 2022-01-11 11:45:29 +08:00 committed by GitHub
parent c1ed45150d
commit ff25226adb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 34 deletions

View File

@ -79,10 +79,11 @@ static vx_program _create_program_from_code
vsi_nn_kernel_t* kernel vsi_nn_kernel_t* kernel
); );
static const void* _load_internal_executable static const uint8_t* _load_internal_executable
( (
const char* source_name, const char* source_name,
size_t* size size_t* size,
vsi_nn_kernel_type_e type
); );
static char* _load_source_code_from_file static char* _load_source_code_from_file
@ -216,21 +217,62 @@ static vsi_status _cpu_register
return status; return status;
} /* _cpu_register() */ } /* _cpu_register() */
static const void* _load_internal_executable #if VSI_USE_VXC_BINARY
static const uint8_t* _load_bin
( (
const char* source_name, const char* source_name,
size_t* size size_t* size,
const vsi_nn_vx_bin_resource_item_type* source_map,
size_t source_map_size,
const char* tail
)
{
const uint8_t* source;
char source_path[VSI_NN_MAX_PATH];
size_t n;
int i;
source = NULL;
n = snprintf( source_path, VSI_NN_MAX_PATH, "%s%s", source_name, tail );
if( n == VSI_NN_MAX_PATH )
{
VSILOGE("Kernel source path overflow %d/%d", n, VSI_NN_MAX_PATH);
*size = 0;
return NULL;
}
for( i = 0; i < (int)source_map_size; i++ )
{
if( strncmp( source_map[i].name, source_path, VSI_NN_MAX_PATH ) == 0 )
{
source = source_map[i].data;
*size = source_map[i].len;
break;
}
}
if( !source )
{
*size = 0;
}
return source;
} /* _load_bin() */
#endif
static const uint8_t* _load_internal_executable
(
const char* source_name,
size_t* size,
vsi_nn_kernel_type_e type
) )
{ {
#if VSI_USE_VXC_BINARY #if VSI_USE_VXC_BINARY
int i; switch( type )
for( i = 0; i < vx_bin_resource_items_cnt; i++ )
{ {
if( strncmp( vx_bin_resource_items[i].name, source_name, VSI_NN_MAX_PATH ) == 0 ) case VSI_NN_KERNEL_TYPE_EVIS:
{ return _load_bin( source_name, size,
*size = (size_t)vx_bin_resource_items[i].len; vx_bin_resource_items_vx, vx_bin_resource_items_vx_cnt, "_vx" );
return vx_bin_resource_items[i].data; break;
} case VSI_NN_KERNEL_TYPE_CL:
return _load_bin( source_name, size,
vx_bin_resource_items_cl, vx_bin_resource_items_cl_cnt, "_cl" );
} }
#endif #endif
return NULL; return NULL;
@ -393,7 +435,7 @@ static vx_program _create_program_from_executable
memset( &program_info, 0, sizeof( kernel_program_info_t ) ); memset( &program_info, 0, sizeof( kernel_program_info_t ) );
program_info.data = _load_internal_executable( program_info.data = _load_internal_executable(
source_info->data[0], &program_info.size); source_info->data[0], &program_info.size, kernel->type);
program = vxCreateProgramWithBinary( graph->ctx->c, program = vxCreateProgramWithBinary( graph->ctx->c,
(const vx_uint8 *)program_info.data, program_info.size ); (const vx_uint8 *)program_info.data, program_info.size );
return program; return program;

View File

@ -104,10 +104,10 @@ __kernel void conv1d_U8U8I32toU8_K1024_LARGE(
vxc_short8 w_zp = (short)weight_ZP; vxc_short8 w_zp = (short)weight_ZP;
vxc_uchar16 input_val = 0, weight_val = 0; vxc_uchar16 input_val = 0, weight_val = 0;
int temp = 0, i, j; int temp = 0, i, j;
Tensor src_tensor = create_image_from_image2d(input, 1); Tensor src_tensor = create_tensor_from_image2d_array(input, 1);
uchar *src_ptr_base = (uchar *)src_image.ptr; uchar *src_ptr_base = (uchar *)src_tensor.ptr;
uchar *src_ptr; uchar *src_ptr;
Tensor dst_tensor = create_image_from_image2d(output, 1); Tensor dst_tensor = create_tensor_from_image2d_array(output, 1);
uchar *dst_ptr = (uchar *)dst_tensor.ptr; uchar *dst_ptr = (uchar *)dst_tensor.ptr;
temp = read_imagei(bias, coord.yz).x; temp = read_imagei(bias, coord.yz).x;
@ -116,7 +116,7 @@ __kernel void conv1d_U8U8I32toU8_K1024_LARGE(
for (i = 0; i < input_height; i++) for (i = 0; i < input_height; i++)
{ {
src_ptr = src_ptr_base + (coord.x + coord.z * src_image.stride_y); src_ptr = src_ptr_base + (coord.x + coord.z * src_tensor.stride_y);
for (j = 0; j < kernel_cnt_x16; j++) for (j = 0; j < kernel_cnt_x16; j++)
{ {
VXC_ReadImage2DArray(weight_val, weight, coord_w, VXC_5BITOFFSET_XY(0, 0), \ VXC_ReadImage2DArray(weight_val, weight, coord_w, VXC_5BITOFFSET_XY(0, 0), \

View File

@ -262,7 +262,7 @@ __kernel __attribute__((reqd_work_group_size(16, 1, 1))) \
{ \ { \
int lidx = get_local_id(0); \ int lidx = get_local_id(0); \
int offset = get_global_id(0); \ int offset = get_global_id(0); \
Image src_img = create_image_from_image2d(input, 1); Image src_img = create_image_from_image2d(input, 1); \
uchar *src_ptr_base = (uchar *)src_img.ptr; \ uchar *src_ptr_base = (uchar *)src_img.ptr; \
uchar *src_ptr; \ uchar *src_ptr; \
vxc_uchar8 src0, src1; \ vxc_uchar8 src0, src1; \

View File

@ -7,7 +7,7 @@
Description : Description :
============================================================================ ============================================================================
*/ */
#include "cl_viv_vx_ext.h" #pragma OPENCL EXTENSION cl_viv_vx_extension : enable
typedef struct Image typedef struct Image
{ {

View File

@ -33,10 +33,6 @@
#include "libnnext/vsi_nn_vxkernel.h" #include "libnnext/vsi_nn_vxkernel.h"
#include "kernel/vsi_nn_kernel.h" #include "kernel/vsi_nn_kernel.h"
#include "libnnext/vsi_nn_libnnext_resource.h" #include "libnnext/vsi_nn_libnnext_resource.h"
#if VSI_USE_VXC_BINARY
/*this header can be only included once in all *.c files*/
#include "libnnext/vx_bin/vxc_binaries.h"
#endif
static char s_vx_resource_path[VSI_NN_MAX_PATH] = "VX"; static char s_vx_resource_path[VSI_NN_MAX_PATH] = "VX";
@ -454,7 +450,7 @@ vx_node vsi_nn_RegisterClientKernelAndCreateNode
) )
{ {
/* /*
* Deprecated: use vsi_nn_RegisterClientKernelAndNewNode() insteatd. * Deprecated: use vsi_nn_RegisterClientKernelAndNewNode() instead.
*/ */
vsi_nn_kernel_info_t kernel_info; vsi_nn_kernel_info_t kernel_info;
char *resource_name[1] = {NULL}; char *resource_name[1] = {NULL};
@ -543,17 +539,6 @@ const uint8_t * vsi_nn_VxBinResourceGetResource
vx_size *len vx_size *len
) )
{ {
#if VSI_USE_VXC_BINARY
int i;
for (i = 0; i < vx_bin_resource_items_cnt; i++)
{
if (strncmp(vx_bin_resource_items[i].name, name, VSI_NN_MAX_PATH) == 0)
{
*len = vx_bin_resource_items[i].len;
return vx_bin_resource_items[i].data;
}
}
#endif
return NULL; return NULL;
} /* vsi_nn_VxResourceGetBinResource() */ } /* vsi_nn_VxResourceGetBinResource() */