From 7d88a668e35c6329273f96e714ee218c62cdd620 Mon Sep 17 00:00:00 2001 From: liyuenan <37231553+liyuenan2333@users.noreply.github.com> Date: Mon, 25 Jul 2022 09:29:22 +0800 Subject: [PATCH] Update internal for 22Q2 release (#432) * Update internal for 22Q2 release update to internal commit-id: e96103281b08404cabb9b65306587627cfa3cb93 Signed-off-by: yuenan.li * Update prebuilt for 22Q2 release Signed-off-by: yuenan.li Co-authored-by: yuenan.li --- .gitignore | 1 + prebuilt-sdk/x86_64_linux/VERSION | 2 +- .../x86_64_linux/include/VX/vx_kernels.h | 2 + .../include/VX/vx_khr_compatible.h | 41 + .../x86_64_linux/include/VX/vx_khr_nn.h | 89 +- .../include/VX/vx_khr_nn_internal.h | 9 + .../x86_64_linux/include/VX/vx_nodes.h | 34 + .../x86_64_linux/include/VX/vx_spinst.h | 332 + .../x86_64_linux/include/VX/vx_types.h | 10 + .../x86_64_linux/lib/libArchModelSw.so | Bin 425736 -> 410808 bytes prebuilt-sdk/x86_64_linux/lib/libCLC.so | Bin 2796616 -> 2805384 bytes prebuilt-sdk/x86_64_linux/lib/libEmulator.so | Bin 2824592 -> 2727488 bytes prebuilt-sdk/x86_64_linux/lib/libGAL.so | Bin 2495320 -> 2490632 bytes .../x86_64_linux/lib/libNNArchPerf.so | Bin 473448 -> 442920 bytes prebuilt-sdk/x86_64_linux/lib/libOpenVX.so | Bin 18 -> 9359224 bytes prebuilt-sdk/x86_64_linux/lib/libOpenVX.so.1 | Bin 18 -> 9359224 bytes .../x86_64_linux/lib/libOpenVX.so.1.3.0 | Bin 8684144 -> 9359224 bytes prebuilt-sdk/x86_64_linux/lib/libOpenVXC.so | Bin 65576 -> 65576 bytes prebuilt-sdk/x86_64_linux/lib/libOpenVXU.so | Bin 44136 -> 44136 bytes prebuilt-sdk/x86_64_linux/lib/libVSC.so | Bin 17543096 -> 17654704 bytes src/tim/vx/internal/include/interface/ops.def | 7 + .../include/kernel/vsi_nn_gpu_config.h | 7 +- .../internal/include/kernel/vsi_nn_kernel.h | 32 +- .../include/kernel/vsi_nn_kernel_lut.h | 2 + .../vx/internal/include/ops/vsi_nn_op_crop.h | 9 + .../internal/include/ops/vsi_nn_op_cumsum.h | 45 + .../include/ops/vsi_nn_op_max_pool3d.h | 55 + .../vx/internal/include/ops/vsi_nn_op_mod.h | 44 + .../vx/internal/include/ops/vsi_nn_op_rcp.h | 47 + .../vx/internal/include/ops/vsi_nn_op_sign.h | 47 + .../internal/include/ops/vsi_nn_op_softsign.h | 47 + .../include/utils/vsi_nn_dtype_util_prv.h | 65 +- .../vx/internal/include/utils/vsi_nn_math.h | 12 +- .../vx/internal/include/utils/vsi_nn_util.h | 13 +- src/tim/vx/internal/include/vsi_nn_context.h | 2 + src/tim/vx/internal/include/vsi_nn_daemon.h | 2 +- src/tim/vx/internal/include/vsi_nn_feature.h | 2 +- src/tim/vx/internal/include/vsi_nn_log.h | 2 +- .../vx/internal/include/vsi_nn_node_type.h | 12 + .../include/vsi_nn_pre_post_process.h | 12 + src/tim/vx/internal/include/vsi_nn_pub.h | 2 +- src/tim/vx/internal/include/vsi_nn_types.h | 10 +- src/tim/vx/internal/include/vsi_nn_version.h | 2 +- src/tim/vx/internal/src/kernel/cl/argmax_cl.c | 4 +- src/tim/vx/internal/src/kernel/cl/argmin_cl.c | 6 +- src/tim/vx/internal/src/kernel/cl/cumsum_cl.c | 365 + .../internal/src/kernel/cl/eltwise_unary_cl.c | 101 +- src/tim/vx/internal/src/kernel/cl/gather_cl.c | 3 +- .../vx/internal/src/kernel/cl/gather_nd_cl.c | 3 +- .../src/kernel/cl/instance_normalization_cl.c | 149 +- .../src/kernel/cl/maxpoolwithargmax_cl.c | 312 + src/tim/vx/internal/src/kernel/cl/mod_cl.c | 303 + .../vx/internal/src/kernel/cl/roi_align_cl.c | 50 +- .../vx/internal/src/kernel/cl/scatter_nd_cl.c | 3 +- .../src/kernel/cl/scatter_nd_update_cl.c | 3 +- src/tim/vx/internal/src/kernel/cl/topk_cl.c | 216 +- .../vx/internal/src/kernel/cpu/cumsum_cpu.c | 260 + .../src/kernel/cpu/eltwise_unary_cpu.c | 32 +- .../src/kernel/cpu/maxpoolwithargmax_cpu.c | 284 + src/tim/vx/internal/src/kernel/cpu/mod_cpu.c | 247 + .../cpu/pre_process_rgb888_planar_cpu.c | 40 +- .../internal/src/kernel/cpu/roi_align_cpu.c | 9 +- .../vx/internal/src/kernel/evis/cumsum_evis.c | 770 + .../src/kernel/evis/eltwise_unary_evis.c | 317 +- .../vx/internal/src/kernel/evis/gather_evis.c | 10 +- .../internal/src/kernel/evis/gather_nd_evis.c | 2 +- .../kernel/evis/group_normalization_evis.c | 734 +- .../kernel/evis/grucell_activation_z_h_evis.c | 6 +- .../evis/grucell_h_times_activation_r_evis.c | 11 +- .../kernel/evis/instance_normalization_evis.c | 883 +- .../src/kernel/evis/l2normalizescale_evis.c | 173 +- .../kernel/evis/layer_normalization_evis.c | 1197 +- .../internal/src/kernel/evis/matrixmul_evis.c | 1 + .../internal/src/kernel/evis/maximum_evis.c | 2 +- .../internal/src/kernel/evis/minimum_evis.c | 2 +- .../vx/internal/src/kernel/evis/mod_evis.c | 444 + .../vx/internal/src/kernel/evis/pow_evis.c | 584 +- .../src/kernel/evis/pre_process_bgra_evis.c | 5 +- .../src/kernel/evis/pre_process_gray_evis.c | 5 +- .../src/kernel/evis/pre_process_nv12_evis.c | 5 +- .../evis/pre_process_rgb888_planar_evis.c | 173 +- .../src/kernel/evis/pre_process_rgb_evis.c | 5 +- .../src/kernel/evis/pre_process_yuv420_evis.c | 19 +- .../src/kernel/evis/pre_process_yuv444_evis.c | 19 +- .../src/kernel/evis/resize_bilinear_evis.c | 783 +- .../kernel/evis/resize_bilinear_nhwc_evis.c | 294 +- .../src/kernel/evis/scatter_nd_evis.c | 2 +- .../src/kernel/evis/scatter_nd_update_evis.c | 2 +- .../vx/internal/src/kernel/evis/select_evis.c | 186 +- .../vx/internal/src/kernel/evis/slice_evis.c | 63 +- .../vx/internal/src/kernel/vsi_nn_kernel.c | 37 +- .../internal/src/kernel/vsi_nn_kernel_lut.c | 16 + .../src/kernel/vsi_nn_kernel_selector.c | 4 + .../internal/src/kernel/vx/eltwise_unary_vx.c | 2 + src/tim/vx/internal/src/kernel/vx/resize_vx.c | 152 + src/tim/vx/internal/src/kernel/vx/square_vx.c | 52 - .../vx/internal/src/libnnext/ops/cl/cumsum.cl | 478 + .../internal/src/libnnext/ops/cl/cumsum_2d.cl | 314 + .../src/libnnext/ops/cl/eltwise_unary_0.cl | 21 + .../src/libnnext/ops/cl/eltwise_unary_1.cl | 21 + .../ops/cl/instance_normalization_f16.cl | 229 - .../ops/cl/instance_normalization_f32.cl | 108 +- .../ops/cl/instance_normalization_i32.cl | 208 +- .../ops/cl/instance_normalization_u8.cl | 214 +- .../src/libnnext/ops/cl/maxpoolwithargmax.cl | 191 + .../libnnext/ops/cl/maxpoolwithargmax_2d.cl | 190 + .../vx/internal/src/libnnext/ops/cl/mod.cl | 306 + .../internal/src/libnnext/ops/cl/roi_align.cl | 154 +- .../src/libnnext/ops/cl/topk_odd_even_sort.cl | 327 + .../vx/internal/src/libnnext/ops/vx/cumsum.vx | 262 + .../internal/src/libnnext/ops/vx/cumsum_2d.vx | 204 + .../src/libnnext/ops/vx/cumsum_bf16.vx | 188 + .../src/libnnext/ops/vx/cumsum_f16_u8.vx | 178 + .../src/libnnext/ops/vx/eltwise_unary_2d_1.vx | 126 +- .../src/libnnext/ops/vx/eltwise_unary_3d_1.vx | 126 +- .../libnnext/ops/vx/group_normalization_0.vx | 370 + .../libnnext/ops/vx/group_normalization_1.vx | 233 + .../libnnext/ops/vx/group_normalization_2.vx | 347 + .../ops/vx/group_normalization_f16.vx | 306 - .../ops/vx/group_normalization_f16_scale.vx | 174 - .../ops/vx/group_normalization_i16.vx | 339 - .../ops/vx/group_normalization_i16_scale.vx | 191 - .../libnnext/ops/vx/group_normalization_i8.vx | 317 - .../ops/vx/group_normalization_i8_scale.vx | 186 - .../libnnext/ops/vx/group_normalization_u8.vx | 342 - .../ops/vx/group_normalization_u8_f16.vx | 207 - .../libnnext/ops/vx/grucell_activation_z_h.vx | 12 +- .../ops/vx/grucell_h_times_activation_r.vx | 12 +- .../ops/vx/instance_normalization_0.vx | 268 + .../ops/vx/instance_normalization_1.vx | 154 + .../ops/vx/instance_normalization_2.vx | 285 + ...32_bf16.vx => instance_normalization_3.vx} | 52 +- .../ops/vx/instance_normalization_f16.vx | 259 - .../ops/vx/instance_normalization_i16.vx | 416 - .../ops/vx/instance_normalization_i8.vx | 397 - .../vx/instance_normalization_scale_f32.vx | 289 - .../instance_normalization_scale_f32_f16.vx | 146 - .../ops/vx/instance_normalization_u8.vx | 254 - .../ops/vx/instance_normalization_u8_f16.vx | 147 - .../libnnext/ops/vx/l2normalizescale_axis0.vx | 54 +- .../ops/vx/l2normalizescale_axis0_2d.vx | 207 + .../libnnext/ops/vx/layer_normalization.vx | 279 - .../libnnext/ops/vx/layer_normalization_0.vx | 390 + .../libnnext/ops/vx/layer_normalization_1.vx | 343 + .../libnnext/ops/vx/layer_normalization_2.vx | 385 + .../libnnext/ops/vx/layer_normalization_2d.vx | 234 - ...e_f32_bf16.vx => layer_normalization_3.vx} | 0 .../ops/vx/layer_normalization_i16.vx | 168 - .../ops/vx/layer_normalization_scale_f32.vx | 276 - .../vx/layer_normalization_scale_f32_2d.vx | 237 - .../ops/vx/layer_normalization_u8_f16.vx | 239 - .../ops/vx/layer_normalization_wh_f16.vx | 430 - .../ops/vx/layer_normalization_wh_i16.vx | 268 - .../ops/vx/layer_normalization_wh_u8.vx | 423 - .../src/libnnext/ops/vx/matrixmul_bf16.vx | 4 +- .../src/libnnext/ops/vx/matrixmul_f16.vx | 4 +- .../libnnext/ops/vx/matrixmul_f16f16_u8.vx | 2 + .../libnnext/ops/vx/matrixmul_f16i16_i16.vx | 2 + .../libnnext/ops/vx/matrixmul_f16u8_f16.vx | 2 + .../src/libnnext/ops/vx/matrixmul_f16u8_u8.vx | 1 + .../src/libnnext/ops/vx/matrixmul_i16.vx | 1 + .../src/libnnext/ops/vx/matrixmul_transA.vx | 5 +- .../libnnext/ops/vx/matrixmul_transB_f16.vx | 2 +- .../ops/vx/matrixmul_transB_f16_mix.vx | 2 +- .../ops/vx/matrixmul_transB_u8_mix.vx | 4 +- .../src/libnnext/ops/vx/matrixmul_u8.vx | 1 + .../libnnext/ops/vx/matrixmul_u8f16_f16.vx | 2 + .../src/libnnext/ops/vx/matrixmul_u8f16_u8.vx | 2 + .../src/libnnext/ops/vx/matrixmul_u8u8_f16.vx | 9 +- .../vx/internal/src/libnnext/ops/vx/mod.vx | 185 + .../vx/internal/src/libnnext/ops/vx/pow.vx | 247 + .../internal/src/libnnext/ops/vx/pow_fp16.vx | 338 - .../src/libnnext/ops/vx/pow_fp16_i16.vx | 322 - .../src/libnnext/ops/vx/pow_fp16_i8.vx | 239 - .../internal/src/libnnext/ops/vx/pow_i16.vx | 227 - .../vx/internal/src/libnnext/ops/vx/pow_i8.vx | 231 - .../vx/internal/src/libnnext/ops/vx/pow_u8.vx | 349 - .../ops/vx/pre_process_rgb888_planar_0.vx | 150 +- .../ops/vx/pre_process_rgb888_planar_1.vx | 36 +- .../ops/vx/pre_process_rgb888_planar_2.vx | 70 +- .../ops/vx/pre_process_rgb888_planar_sep_0.vx | 330 + .../ops/vx/pre_process_rgb888_planar_sep_1.vx | 143 + .../ops/vx/pre_process_rgb888_planar_sep_2.vx | 122 + .../ops/vx/resize_bilinear_nhwc_bound.vx | 153 + .../vx/internal/src/libnnext/ops/vx/select.vx | 135 +- .../vx/internal/src/libnnext/ops/vx/slice.vx | 32 +- .../src/libnnext/vsi_nn_libnnext_resource.c | 16398 +++++++--------- src/tim/vx/internal/src/ops/vsi_nn_op_abs.c | 38 +- src/tim/vx/internal/src/ops/vsi_nn_op_addn.c | 5 +- .../internal/src/ops/vsi_nn_op_batch_norm.c | 67 +- src/tim/vx/internal/src/ops/vsi_nn_op_cast.c | 41 +- src/tim/vx/internal/src/ops/vsi_nn_op_ceil.c | 27 +- src/tim/vx/internal/src/ops/vsi_nn_op_clip.c | 8 +- .../vx/internal/src/ops/vsi_nn_op_conv1d.c | 12 +- .../vx/internal/src/ops/vsi_nn_op_conv2d.c | 92 + src/tim/vx/internal/src/ops/vsi_nn_op_crop.c | 198 +- .../vx/internal/src/ops/vsi_nn_op_cumsum.c | 178 + .../internal/src/ops/vsi_nn_op_dataconvert.c | 54 +- .../src/ops/vsi_nn_op_deconvolution.c | 185 +- .../src/ops/vsi_nn_op_deconvolution1d.c | 2 +- .../src/ops/vsi_nn_op_depth2space_internal.c | 38 +- .../vx/internal/src/ops/vsi_nn_op_dropout.c | 28 +- .../vx/internal/src/ops/vsi_nn_op_eltwise.c | 243 +- .../src/ops/vsi_nn_op_eltwise_unary.c | 9 + src/tim/vx/internal/src/ops/vsi_nn_op_erf.c | 9 +- .../src/ops/vsi_nn_op_expand_broadcast.c | 50 +- src/tim/vx/internal/src/ops/vsi_nn_op_floor.c | 40 +- .../internal/src/ops/vsi_nn_op_fullconnect.c | 81 + .../src/ops/vsi_nn_op_fullconnect_relu.c | 4 +- .../src/ops/vsi_nn_op_groupnormalize.c | 51 +- .../src/ops/vsi_nn_op_instancenormalize.c | 37 +- .../src/ops/vsi_nn_op_layernormalize.c | 77 +- .../internal/src/ops/vsi_nn_op_leaky_relu.c | 28 +- .../vx/internal/src/ops/vsi_nn_op_linear.c | 28 +- .../internal/src/ops/vsi_nn_op_log_softmax.c | 43 +- .../internal/src/ops/vsi_nn_op_max_pool3d.c | 300 + .../src/ops/vsi_nn_op_maxpoolwithargmax.c | 223 + src/tim/vx/internal/src/ops/vsi_nn_op_mod.c | 237 + src/tim/vx/internal/src/ops/vsi_nn_op_nbg.c | 59 +- src/tim/vx/internal/src/ops/vsi_nn_op_pad.c | 46 +- src/tim/vx/internal/src/ops/vsi_nn_op_pad2.c | 63 +- .../vx/internal/src/ops/vsi_nn_op_permute.c | 79 +- src/tim/vx/internal/src/ops/vsi_nn_op_pool.c | 125 +- .../src/ops/vsi_nn_op_poolwithargmax.c | 10 +- .../internal/src/ops/vsi_nn_op_pre_process.c | 21 +- .../src/ops/vsi_nn_op_pre_process_rgb.c | 1 - .../ops/vsi_nn_op_pre_process_rgb888_planar.c | 54 +- .../vx/internal/src/ops/vsi_nn_op_reduce.c | 17 +- .../src/ops/vsi_nn_op_relational_ops.c | 94 +- .../vx/internal/src/ops/vsi_nn_op_repeat.c | 23 +- .../vx/internal/src/ops/vsi_nn_op_reshape.c | 30 +- .../vx/internal/src/ops/vsi_nn_op_reshape2.c | 39 +- .../vx/internal/src/ops/vsi_nn_op_resize.c | 71 +- .../vx/internal/src/ops/vsi_nn_op_reverse.c | 55 +- .../vx/internal/src/ops/vsi_nn_op_roi_align.c | 17 +- src/tim/vx/internal/src/ops/vsi_nn_op_rsqrt.c | 19 +- .../vx/internal/src/ops/vsi_nn_op_select.c | 70 +- src/tim/vx/internal/src/ops/vsi_nn_op_slice.c | 36 +- .../vx/internal/src/ops/vsi_nn_op_softmax.c | 62 +- .../src/ops/vsi_nn_op_space2depth_internal.c | 18 +- src/tim/vx/internal/src/ops/vsi_nn_op_split.c | 39 +- .../vx/internal/src/ops/vsi_nn_op_squeeze.c | 4 +- .../src/ops/vsi_nn_op_strided_slice.c | 139 +- src/tim/vx/internal/src/ops/vsi_nn_op_swish.c | 31 +- src/tim/vx/internal/src/ops/vsi_nn_op_tile.c | 27 +- .../vx/internal/src/ops/vsi_nn_op_upsample.c | 4 +- .../src/utils/vsi_nn_code_generator.c | 7 + src/tim/vx/internal/src/utils/vsi_nn_dtype.c | 15 +- .../vx/internal/src/utils/vsi_nn_dtype_util.c | 64 +- src/tim/vx/internal/src/utils/vsi_nn_util.c | 141 +- src/tim/vx/internal/src/vsi_nn_context.c | 2 + src/tim/vx/internal/src/vsi_nn_graph.c | 76 +- .../internal/src/vsi_nn_node_attr_template.c | 3 + .../vx/internal/src/vsi_nn_pre_post_process.c | 99 +- src/tim/vx/internal/src/vsi_nn_rnn_helper.c | 10 +- src/tim/vx/internal/src/vsi_nn_tensor.c | 2 +- 256 files changed, 24998 insertions(+), 22686 deletions(-) create mode 100644 prebuilt-sdk/x86_64_linux/include/VX/vx_spinst.h mode change 120000 => 100755 prebuilt-sdk/x86_64_linux/lib/libOpenVX.so mode change 120000 => 100755 prebuilt-sdk/x86_64_linux/lib/libOpenVX.so.1 create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_cumsum.h create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_max_pool3d.h create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_mod.h create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_rcp.h create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_sign.h create mode 100644 src/tim/vx/internal/include/ops/vsi_nn_op_softsign.h create mode 100644 src/tim/vx/internal/src/kernel/cl/cumsum_cl.c create mode 100644 src/tim/vx/internal/src/kernel/cl/maxpoolwithargmax_cl.c create mode 100644 src/tim/vx/internal/src/kernel/cl/mod_cl.c create mode 100644 src/tim/vx/internal/src/kernel/cpu/cumsum_cpu.c create mode 100644 src/tim/vx/internal/src/kernel/cpu/maxpoolwithargmax_cpu.c create mode 100644 src/tim/vx/internal/src/kernel/cpu/mod_cpu.c create mode 100644 src/tim/vx/internal/src/kernel/evis/cumsum_evis.c create mode 100644 src/tim/vx/internal/src/kernel/evis/mod_evis.c create mode 100644 src/tim/vx/internal/src/kernel/vx/resize_vx.c create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/cumsum.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/cumsum_2d.cl delete mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/instance_normalization_f16.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/maxpoolwithargmax.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/maxpoolwithargmax_2d.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/mod.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/cl/topk_odd_even_sort.cl create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/cumsum.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/cumsum_2d.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/cumsum_bf16.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/cumsum_f16_u8.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_0.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_1.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_2.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_f16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_f16_scale.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_i16_scale.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_i8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_i8_scale.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_u8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/group_normalization_u8_f16.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_0.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_1.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_2.vx rename src/tim/vx/internal/src/libnnext/ops/vx/{instance_normalization_scale_f32_bf16.vx => instance_normalization_3.vx} (87%) delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_f16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_i8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_scale_f32.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_scale_f32_f16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_u8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/instance_normalization_u8_f16.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/l2normalizescale_axis0_2d.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_0.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_1.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_2.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_2d.vx rename src/tim/vx/internal/src/libnnext/ops/vx/{layer_normalization_scale_f32_bf16.vx => layer_normalization_3.vx} (100%) delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_scale_f32.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_scale_f32_2d.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_u8_f16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_wh_f16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_wh_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/layer_normalization_wh_u8.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/mod.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_fp16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_fp16_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_fp16_i8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_i16.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_i8.vx delete mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pow_u8.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pre_process_rgb888_planar_sep_0.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pre_process_rgb888_planar_sep_1.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/pre_process_rgb888_planar_sep_2.vx create mode 100644 src/tim/vx/internal/src/libnnext/ops/vx/resize_bilinear_nhwc_bound.vx create mode 100644 src/tim/vx/internal/src/ops/vsi_nn_op_cumsum.c create mode 100644 src/tim/vx/internal/src/ops/vsi_nn_op_max_pool3d.c create mode 100644 src/tim/vx/internal/src/ops/vsi_nn_op_maxpoolwithargmax.c create mode 100644 src/tim/vx/internal/src/ops/vsi_nn_op_mod.c diff --git a/.gitignore b/.gitignore index 8def752..cef9f4c 100644 --- a/.gitignore +++ b/.gitignore @@ -336,3 +336,4 @@ ASALocalRun/ # IDE .settings/ build/ +*_build/ diff --git a/prebuilt-sdk/x86_64_linux/VERSION b/prebuilt-sdk/x86_64_linux/VERSION index 703a8d3..e5a66ba 100644 --- a/prebuilt-sdk/x86_64_linux/VERSION +++ b/prebuilt-sdk/x86_64_linux/VERSION @@ -1 +1 @@ -REL/6.4.10.2 +6.4.11 diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_kernels.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_kernels.h index a8ea910..8b93beb 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_kernels.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_kernels.h @@ -499,6 +499,8 @@ enum vx_kernel_e { VX_KERNEL_NN_DECONV_3D_LAYER = VX_KERNEL_BASE(VX_ID_VIVANTE, VX_LIBRARY_KHR_BASE) + 0x31, + VX_KERNEL_STREAM_PROCESSOR = VX_KERNEL_BASE(VX_ID_VIVANTE, VX_LIBRARY_KHR_BASE) + 0x32, + VX_KERNEL_MAX_1_2, /*!< \internal Used for VX1.2 bounds checking in the conformance test. */ }; diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_compatible.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_compatible.h index 74f3592..6cf283c 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_compatible.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_compatible.h @@ -196,4 +196,45 @@ VX_DECONV_3D_API_SUPPORT is used to declare that vsi openvx driver can support d #define VX_TENSOR_STRIDE_X_BITS_SUPPORT 1 #endif +/* +VX_REMOVE_RESHAPE_SUPPORT is used to declare if graph opt support to remove reshape op, if support, it's not need to remove reshape in ovxlib. + 0: not support + 1: support +*/ +/* +#ifndef VX_REMOVE_RESHAPE_SUPPORT +#define VX_REMOVE_RESHAPE_SUPPORT 0 +#endif +*/ + +/* +VX_STREAM_PROCESSOR_SUPPORT is used to declare that vsi openvx driver can support vxStreamProcessorNode API + [value] + 0: not support + 1: support +*/ +#ifndef VX_STREAM_PROCESSOR_SUPPORT +#define VX_STREAM_PROCESSOR_SUPPORT 0 +#endif + +/* + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL is used to declare that this tensor connect to fixed DMA channel. + [value] + 0: not support + 1: support +*/ +#ifndef VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL +#define VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL 1 +#endif + +/* + VX_SCALE_EXTRA_PARAMETER_SUPPORT is used to declare that RESIZE can support align_cornor and half_pixel_center parameter + [value] + 0: not support + 1: support +*/ +#ifndef VX_SCALE_EXTRA_PARAMETER_SUPPORT +#define VX_SCALE_EXTRA_PARAMETER_SUPPORT 1 +#endif + #endif /* __VX_KHR_COMPATIBLE_H__ */ diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn.h index cca4338..623c541 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn.h @@ -57,6 +57,12 @@ enum vx_graph_attribute_internal_type_e VX_GRAPH_AXI_SRAM_PRE_LOAD = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x2, /*! \brief Queries a graph for its running priority (read-write. Use a \ref vx_uint32 parameter. */ VX_GRAPH_PRIORITY_VALUE_VIV = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x3, + VX_GRAPH_PSI_EXTRATOR_PARAMETER = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x4, + VX_GRAPH_PSI_FILLER_PARAMETER = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x5, + VX_GRAPH_DENOISE_POSTPROCESS_PARAMETER = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x6, + VX_GRAPH_DATA_COMPRESSION_RATIO = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x7, + VX_GRAPH_ISP_EMULATION_PARAMETER = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x8, + VX_GRAPH_PROCESS_FPS = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_GRAPH) + 0x9, }; /*! \brief Size Alignment of User Memory @@ -209,7 +215,8 @@ enum vx_nn_activation_function_e VX_NN_ACTIVATION_LEAKYRELU_MAX_POOLING = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x4, VX_NN_ACTIVATION_SWISH = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x5, VX_NN_ACTIVATION_HSWISH = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x6, - VX_NN_ACTIVATION_NONE = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x7, + VX_NN_ACTIVATION_CUSTOM = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x7, + VX_NN_ACTIVATION_NONE = VX_ENUM_BASE(VX_ID_VIVANTE, VX_ENUM_NN_ACTIVATION_FUNCTION_TYPE) + 0x8, }; /*! \brief The Convolutional network type @@ -285,6 +292,59 @@ enum vx_tensor_rank_type_e VX_TENSOR_RANK_SN, }; +/*! \brief The attribute of tensor. + * \ingroup group_tensor + * \version 0.4 + */ +enum vx_tensor_priority_e +{ + /*! \brief no special requirement */ + VX_TENSOR_DEFAULT = 0, + + /*! \brief 2nd input(reference) */ + /*VX_TENSOR_2ND_INPUT_FOR = 1,*/ + VX_TENSOR_FOR_GRAPH_REFERENCE = 1, +}; + + +/*! \brief The attribute of tensor memory. + * \ingroup group_tensor + * \version 0.4 + */ +enum vx_tensor_memory_attribute_e +{ + /*! \brief no special requirement */ + VX_TENSOR_MEMORY_DEFAULT = 0, + + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_0 = (0x1 << 0), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_1 = (0x1 << 1), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_2 = (0x1 << 2), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_3 = (0x1 << 3), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_4 = (0x1 << 4), + /* + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_5 = (0x1 << VX_DMA5_IN_ISP_OCM_PSI), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_6 = (0x1 << VX_DMA6_DDR_DECOMPRESS), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_7 = (0x1 << VX_DMA7_POSTOUT_OCM_ISP), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_8 = (0x1 << VX_DMA8_COMPRESS_DDR), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_9 = (0x1 << VX_DMA9_ISP_PATTERN_GENERATOR), + VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL_10 = (0x1 << VX_DMA10_ISP_CHECKSUM_GENERATOR), + */ + /*! \brief DMA transfer data to VIP and enable circular buffer */ +#if !VX_TENSOR_MEMORY_CONNECT_DMA_CHANNEL + VX_TENSOR_MEMORY_ENABLE_CIRCULAR_BY_DMA = 0xFFFFFFFF, +#endif +}; + +enum vx_dma_extrator_pad_mode_e +{ + /*! \brief no special requirement */ + VX_DMA_EXTRATOR_PAD_CONST = 0, + + /*! \brief DMA extrator pad with nearest edge */ + VX_DMA_EXTRATOR_PAD_WITH_NEAREAST_EDGE = 1, +}; + + /*! \brief The precision of tensor. * \ingroup group_tensor * \version 0.4 @@ -601,6 +661,19 @@ VX_API_ENTRY vx_tensor VX_API_CALL vxReshapeTensor(vx_tensor tensor, vx_int32* n */ VX_API_ENTRY vx_status VX_API_CALL vxSetTensorAttribute(vx_tensor tensor, vx_enum attribute, const void *ptr, vx_size size); +/*! \brief Creates an opaque reference to a tensor data buffer. + * \details The tensor is a dummy tensor which will not allocate any memory. And it cannot reshape or view. + * Not guaranteed to exist until the vx_graph containing it has been verified. + * \param [in] context The reference to the implementation context. + * \param [in] number_of_dims The number of dimensions. + * \param [in] dims Dimensions sizes in elements. + * \param [in] data_format The \ref vx_type_e that represents the data format of the tensor data elements. + * \return A tensor data reference or zero when an error is encountered. + * \ingroup group_tensor + * \version 0.3 + */ +VX_API_ENTRY vx_tensor VX_API_CALL vxCreateDummyTensor(vx_context context, vx_size number_of_dims, const vx_size *dims, vx_enum data_format); + /*! \brief The type enumeration lists all NN extension types. * \ingroup group_cnn @@ -1317,6 +1390,13 @@ typedef struct _vx_nn_scale_params_t vx_enum type; /*!< \brief The interpolation type, only support VX_INTERPOLATION_BILINEAR. */ } vx_nn_scale_params_t, * vx_nn_scale_params; +typedef struct _vx_nn_scale_params_ext_t +{ + vx_nn_scale_params_t base; + vx_bool align_corners; + vx_bool half_pixel_centers; +} vx_nn_scale_params_ext_t, * vx_nn_scale_params_ext; + /*! \brief [Graph] Creates a scale Layer Node. * \param [in] graph The reference to the parent graph. * \param [in] input The input tensor data to scale. @@ -2054,8 +2134,15 @@ typedef struct _vx_hardware_caps_params_ext_t vx_hardware_caps_params_t base; vx_uint32 subGroupSize; /*!< \brief shader sub-group size.*/ vx_bool supportVA40; /*!< \brief support 40bit virtual address.*/ + vx_uint32 supportStreamProcessor; /*!< \brief support stream processor.*/ } vx_hardware_caps_params_ext_t; +typedef struct _vx_hardware_caps_params_ext2_t +{ + vx_hardware_caps_params_ext_t base; + vx_uint32 streamProcessorExecCount; /*!< \brief streamprocess execution count. */ +} vx_hardware_caps_params_ext2_t; + /*! \brief Queries hardware caps information. * \param [in] context The reference to the context. * \param [in] hardware_caps_params \ref vx_hardware_caps_params_t . diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn_internal.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn_internal.h index 506938f..66427cb 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn_internal.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_khr_nn_internal.h @@ -219,6 +219,15 @@ typedef struct _vx_nn_convolution_relu_pooling_params_ext4_t vx_bool enable_nn_tensor_add_relu; /*!< \brief Enable Relu function after tensor add. */ } vx_nn_convolution_relu_pooling_params_ext4_t, * vx_nn_convolution_relu_pooling_params_ext4; +typedef struct _vx_nn_convolution_relu_pooling_params_ext5_t +{ + vx_nn_convolution_relu_pooling_params_ext4_t ext4; /*!< \brief convolution relu pooling params \ref vx_nn_convolution_relu_pooling_params_ext_t */ + + vx_object_array inputs_list; + vx_object_array outputs_list; + vx_spinst spinst_obj; +} vx_nn_convolution_relu_pooling_params_ext5_t, * vx_nn_convolution_relu_pooling_params_ext5; + /*! \brief [Graph] Creates a Convolutional Network Convolution and Activation(Relu) and Pooling Layer Node, this fucntion match kronos NN Extension 1.2 verion. * \details This function implement Convolutional Network Convolution and Activation(Relu) and Pooling layer. * For fixed-point data types, a fixed point calculation is performed with round and saturate according to the number of accumulator bits. The number of the accumulator bits are implementation defined, diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_nodes.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_nodes.h index bf513b5..64504ca 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_nodes.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_nodes.h @@ -963,6 +963,40 @@ VX_API_ENTRY vx_node VX_API_CALL vxBatchGemmNode(vx_graph graph, vx_scalar trans_c, vx_tensor output); +typedef struct _vx_lut_params_s +{ + vx_enum lut_function; /*!< \brief Set VX_NN_ACTIVATION_NONE to disable lut table or set VX_NN_ACTIVATION_CUSTOM to customize lut table or set others to use fixed lut table */ + vx_float32 float_values[4]; /*!< \brief Float parameters of fixed lut table */ + vx_uint32 fvalues_count; /*!< \brief Count of float_values */ + vx_int32 int_values[4]; /*!< \brief Int parameters of fixed lut table */ + vx_uint32 ivalues_count; /*!< \brief Count of int_values */ + vx_lut in_lut; /*!< \brief Only valid when lut_function is VX_NN_ACTIVATION_CUSTOM */ + vx_lut out_lut; /*!< \brief Only valid when lut_function is VX_NN_ACTIVATION_CUSTOM */ +} vx_lut_params_s, * vx_lut_params; + +/*! \brief Create a stream processor node. + * \param [in] graph The reference to the graph. + * \param [in] input_list The input tensor list. + * \param [in] input_count The input tensor count. + * \param [in] output_list The output tensor list. + * \param [in] output_count The output tensor count. + * \param [in] spinst_obj The stream processor instrunction object. Use vxCreateSPINST() to create. + * \param [in] lut_params The lut parameters. Refer to vx_lut_params_s. + * \return \ref vx_node. + * \retval vx_node A node reference. Any possible errors preventing a successful creation + * should be checked using \ref vxGetStatus + * \ingroup group_vision_function_sp + */ +VX_API_ENTRY vx_node VX_API_CALL vxStreamProcessorNode( + vx_graph graph, + vx_tensor* input_list, + vx_uint32 input_count, + vx_tensor* output_list, + vx_uint32 output_count, + vx_spinst spinst_obj, + vx_lut_params lut_params + ); + #ifdef __cplusplus } #endif diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_spinst.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_spinst.h new file mode 100644 index 0000000..bcfe401 --- /dev/null +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_spinst.h @@ -0,0 +1,332 @@ +/**************************************************************************** +* +* Copyright 2017 - 2021 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* 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, sub license, 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 (including the +* next paragraph) 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 NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS 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 _VX_SPINST_H_ +#define _VX_SPINST_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _vx_sp_inst_type_e +{ + VX_SP_INST_TYPE_FADD, + VX_SP_INST_TYPE_FMULT, + VX_SP_INST_TYPE_MOVE, + VX_SP_INST_TYPE_PWL, + + VX_SP_INST_TYPE_COUNT, +} +vx_sp_inst_type_e; + +typedef enum _vx_sp_inst_type_fadd_e +{ + VX_SP_INST_TYPE_FADD_IDLE, // FADD-IDLE + VX_SP_INST_TYPE_FADD_ADD, // dst = src0 + src1 + VX_SP_INST_TYPE_FADD_SUB, // dst = src0 - src1 + + VX_SP_INST_TYPE_FADD_COUNT, +} +vx_sp_inst_type_fadd_e; + +typedef enum _vx_sp_inst_type_fmult_e +{ + VX_SP_INST_TYPE_FMULT_IDLE, /* FMULT-IDLE */ + VX_SP_INST_TYPE_FMULT_MUL, /* dst = src0 * src1 */ + VX_SP_INST_TYPE_FMULT_MUL_CLAMP, /* dst = clamp (src0, src1, R6, R7) */ + + VX_SP_INST_TYPE_FMULT_COUNT, +} +vx_sp_inst_type_fmult_e; + +typedef enum _vx_sp_inst_type_move_e +{ + VX_SP_INST_TYPE_MOVE_IDLE, + VX_SP_INST_TYPE_MOVE_MOVE, // dst = src1 + VX_SP_INST_TYPE_MOVE_SEL0, // dst = (src0 > 0) ? src1[0] : src1[1] + VX_SP_INST_TYPE_MOVE_SEL1, // dst = (src0 > 0) ? src1 : FA-src0 // use FA's SRC0 + VX_SP_INST_TYPE_MOVE_IMMD, // dst = Constant assign immmediate + VX_SP_INST_TYPE_MOVE_ABS, // dst = abs(src1) + + VX_SP_INST_TYPE_MOVE_COUNT, +} +vx_sp_inst_type_move_e; + +typedef enum _vx_sp_inst_type_pwl_e +{ + VX_SP_INST_TYPE_PWL_IDLE, + VX_SP_INST_TYPE_PWL_SETUP_0, /* PWL ID = 0 */ + VX_SP_INST_TYPE_PWL_SETUP_1, /* Sigmode() */ + VX_SP_INST_TYPE_PWL_SETUP_2, /* Tanh() */ + + VX_SP_INST_TYPE_PWL_COUNT, +} +vx_sp_inst_type_pwl_e; + +typedef enum _vx_sp_inst_src_dst_e +{ + VX_SP_INST_SPINOUT, + VX_SP_INST_SR1, + VX_SP_INST_SR2, + VX_SP_INST_SR3, + VX_SP_INST_SR4, + VX_SP_INST_SR5, + VX_SP_INST_SR6, /* nn_clamp_min */ + VX_SP_INST_SR7, /* nn_clamp_max */ + VX_SP_INST_SR8, + VX_SP_INST_SR9, + VX_SP_INST_SR10, + VX_SP_INST_VR11, + VX_SP_INST_VR12, + VX_SP_INST_VR13, + VX_SP_INST_VR14, + VX_SP_INST_SETUPOUT, /* Input of PWL Mult and Add: FMInA, FMInB, FAInA, FAInB */ +} +vx_sp_inst_src_dst_e; + +typedef struct _vx_spinst_unit_param +{ + vx_enum op; /* vx_sp_inst_type_e */ + + struct + { + vx_enum op; /* vx_sp_inst_type_fadd/fmult/move/pwl_e */ + + struct + { + vx_uint8 src0; /* vx_sp_inst_src_dst_e */ + vx_uint8 src1; /* vx_sp_inst_src_dst_e */ + vx_uint8 dst; /* vx_sp_inst_src_dst_e */ + vx_float32 constant; + } var; + + } sub; + +} +vx_spinst_unit_param; + +/**********************************************************************************************/ + +typedef enum _vx_sp_attribute_e +{ + VX_SP_ATTRIBUTE_NONE, + + VX_SP_ATTRIBUTE_INPUT_TILE_MAPPING, + VX_SP_ATTRIBUTE_OUTPUT_COLLAPSE_X, + VX_SP_ATTRIBUTE_OUTPUT_COLLAPSE_Y, + VX_SP_ATTRIBUTE_OUTPUT_COLLAPSE_Z, + + VX_SP_ATTRIBUTE_PROG_INIT_INSTR_NUM, + VX_SP_ATTRIBUTE_PROG_LOOP_INSTR_NUM, + VX_SP_ATTRIBUTE_PROG_COMPLETE_INSTR_NUM, + VX_SP_ATTRIBUTE_PROG_ROUNDING_MODE, + VX_SP_ATTRIBUTE_INPUT_SETUP, + + VX_SP_ATTRIBUTE_IGNORED_LEADING_OUTPUTS, + VX_SP_ATTRIBUTE_FLUSH_CYCLE_NUM, + VX_SP_ATTRIBUTE_IGNORED_LEADING_V11_WR, + VX_SP_ATTRIBUTE_IGNORED_LEADING_V12_WR, + VX_SP_ATTRIBUTE_IGNORED_LEADING_V11_RD, + VX_SP_ATTRIBUTE_IGNORED_LEADING_V12_RD, + + VX_SP_ATTRIBUTE_CH0_POST_REDISTRIBUTE, + VX_SP_ATTRIBUTE_CH1_POST_REDISTRIBUTE, + VX_SP_ATTRIBUTE_V11_RESET_AT_START, + VX_SP_ATTRIBUTE_V12_RESET_AT_START, + VX_SP_ATTRIBUTE_V11_POP_CONFIG, + VX_SP_ATTRIBUTE_V12_POP_CONFIG, + VX_SP_ATTRIBUTE_ACCELERATOR_INPUT_SELECT, + VX_SP_ATTRIBUTE_IGNORED_LEADING_ACC_OUT, + VX_SP_ATTRIBUTE_SUM_ENGINE_RESET, + VX_SP_ATTRIBUTE_SUM_ENGINE_CONTROL, + VX_SP_ATTRIBUTE_SUM_ENGINE_NUM_CH_MINUS_ONE, + VX_SP_ATTRIBUTE_SUM_ENGINE_2D_ACCUM_STORAGE, + + VX_SP_ATTRIBUTE_GENERAL_COUNT, + + VX_SP_ATTRIBUTE_CONST0, /* NN post multiplier */ + VX_SP_ATTRIBUTE_CONST1, /* NN neg pos multiplier */ + VX_SP_ATTRIBUTE_CONST2, /* NN tensor add const */ + VX_SP_ATTRIBUTE_CONST3, /* NN clamp max */ + VX_SP_ATTRIBUTE_CONST4, /* NN clmap min */ + + VX_SP_ATTRIBUTE_TOTAL_COUNT, +} +vx_sp_attribute_e; + +typedef enum _vx_sp_attribute_input_tile_mapping_e +{ + VX_SP_ATTRIBUTE_INPUT_TILE_MAPPING_XYMERGE, + VX_SP_ATTRIBUTE_INPUT_TILE_MAPPING_YZMERGE, +} +vx_sp_attribute_input_tile_mapping_e; + +typedef enum _vx_sp_attribute_output_collapse_e +{ + VX_SP_ATTRIBUTE_OUTPUT_COLLAPSE_DISABLED, + VX_SP_ATTRIBUTE_OUTPUT_COLLAPSE_ENABLED, +} +vx_sp_attribute_output_collapse_e; + +typedef enum _vx_sp_attribute_rounding_mode_e +{ + VX_SP_ATTRIBUTE_PROG_ROUNDING_MODE_RTNE, + VX_SP_ATTRIBUTE_PROG_ROUNDING_MODE_STICKY, +} +vx_sp_attribute_rounding_mode_e; + +typedef enum _vx_sp_attribute_input_setup_e +{ + VX_SP_ATTRIBUTE_INPUT_SETUP_SINGLE_INPUT, + VX_SP_ATTRIBUTE_INPUT_SETUP_INTERLEAVE_TWO_INPUTS, + VX_SP_ATTRIBUTE_INPUT_SETUP_V11, + VX_SP_ATTRIBUTE_INPUT_SETUP_V12, +} +vx_sp_attribute_input_setup_e; + +typedef enum _vx_sp_attribute_ch_post_redistribute_e +{ + VX_SP_ATTRIBUTE_CH_POST_REDISTRIBUTE_DISABLED, + VX_SP_ATTRIBUTE_CH_POST_REDISTRIBUTE_SCALAR_GATHER, + VX_SP_ATTRIBUTE_CH_POST_REDISTRIBUTE_VECTOR_GATHER, + VX_SP_ATTRIBUTE_CH_POST_REDISTRIBUTE_VECTOR_SCATTER, +} +vx_sp_attribute_ch_post_redistribute_e; + +typedef enum _vx_sp_attribute_v_reset_at_start_e +{ + VX_SP_ATTRIBUTE_V_RESET_AT_START_NONE, + VX_SP_ATTRIBUTE_V_RESET_AT_START_RESET, +} +vx_sp_attribute_v_reset_at_start_e; + +typedef enum _vx_sp_attribute_v_pop_config_e +{ + VX_SP_ATTRIBUTE_V_POP_CONFIG_EVERY_READ, + VX_SP_ATTRIBUTE_V_POP_CONFIG_EVERY_ROW, +} +vx_sp_attribute_v_pop_config_e; + +typedef enum _vx_sp_attribute_accelerator_input_select_e +{ + VX_SP_ATTRIBUTE_ACCELERATOR_INPUT_SELECT_FROM_OUTPUT, + VX_SP_ATTRIBUTE_ACCELERATOR_INPUT_SELECT_FROM_ACCLERATOR, +} +vx_sp_attribute_accelerator_input_select_e; + +typedef enum _vx_sp_attribute_sum_engine_reset_e +{ + VX_SP_ATTRIBUTE_SUM_ENGINE_RESET_NONE, + VX_SP_ATTRIBUTE_SUM_ENGINE_RESET_RESET, +} +vx_sp_attribute_sum_engine_reset_e; + +typedef enum _vx_sp_attribute_sum_engine_control_e +{ + VX_SP_ATTRIBUTE_SUM_ENGINE_CONTROL_ACCUM_INTERNAL, + VX_SP_ATTRIBUTE_SUM_ENGINE_CONTROL_ACCUM_1D, + VX_SP_ATTRIBUTE_SUM_ENGINE_CONTROL_ACCUM_2D, +} +vx_sp_attribute_sum_engine_control_e; + +typedef enum _vx_sp_attribute_sum_engine_num_ch_minus_one_e +{ + VX_SP_ATTRIBUTE_SUM_ENGINE_NUM_CH_MINUS_ONE_ONE_CH, + VX_SP_ATTRIBUTE_SUM_ENGINE_NUM_CH_MINUS_ONE_TWO_CH, +} +vx_sp_attribute_sum_engine_num_ch_minus_one_e; + +typedef enum _vx_sp_attribute_sum_engine_2d_accum_storage_e +{ + VX_SP_ATTRIBUTE_SUM_ENGINE_2D_ACCUM_STORAGE_SAME, + VX_SP_ATTRIBUTE_SUM_ENGINE_2D_ACCUM_STORAGE_DIFFERENT, +} +vx_sp_attribute_sum_engine_2d_accum_storage_e; + +/**********************************************************************************************/ + +/*! \brief Creates an opaque reference to a spinst data. + * \param [in] context The reference to the implementation context. + * \return A spinst data reference. + * \Any possible errors preventing a successful creation should be checked using \ref vxGetStatus. + * \ingroup group_object_spinst + */ +VX_API_ENTRY vx_spinst VX_API_CALL vxCreateSPINST( + vx_context context + ); + +/*! \brief Releases a reference to a spinst object. + * The object may not be garbage collected until its total reference count is zero. + * \param [in] spinst_obj The pointer to the spinst data to release. + * \post After returning from this function the reference is zeroed. + * \return A \ref vx_status_e enumeration. + * \retval VX_SUCCESS No errors; all other values indicate failure + * \retval * An error occurred. See \ref vx_status_e. + * \ingroup group_object_spinst + */ +VX_API_ENTRY vx_status VX_API_CALL vxReleaseSPINST( + vx_spinst *spinst_obj + ); + +/*! \brief Add a instruction to spinst object. + * \param [in] spinst_obj The reference to the spinst object. + * \param [in] inst_unit_array The units of one instruction. Use a \ref vx_spinst_unit_param. + * \param [in] inst_unit_count The count of instruction units. + * \return A \ref vx_status_e enumeration. + * \retval VX_SUCCESS No errors. + * \retval VX_ERROR_INVALID_REFERENCE If data is not a \ref spinst_obj. + * \retval VX_ERROR_INVALID_PARAMETERS If any of parameters is incorrect. + * \retval VX_ERROR_NO_MEMORY If fail to allocate internal instruction memory. + * \ingroup group_object_spinst + */ +VX_API_ENTRY vx_status VX_API_CALL vxAddOneInstToSPINST( + vx_spinst spinst_obj, + vx_spinst_unit_param* inst_unit_array, + vx_uint8 inst_unit_count + ); + +/*! \brief Set various attributes of a spinst data. + * \param [in] spinst_obj The reference to the vx_spinst object to set. + * \param [in] attribute The attribute to set. Use a \ref vx_sp_attribute_e. + * \param [in] value The value of attribute. + * \return A \ref vx_status_e enumeration. + * \retval VX_SUCCESS No errors. + * \retval VX_ERROR_INVALID_REFERENCE If data is not a \ref vx_spinst. + * \retval VX_ERROR_INVALID_PARAMETERS If any of attribute is incorrect. + * \ingroup group_object_spinst + */ +VX_API_ENTRY vx_status VX_API_CALL vxSetAttributeToSPINST( + vx_spinst spinst_obj, + vx_enum attribute, + vx_uint32 value + ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/prebuilt-sdk/x86_64_linux/include/VX/vx_types.h b/prebuilt-sdk/x86_64_linux/include/VX/vx_types.h index 0dbdcc8..e10a32e 100644 --- a/prebuilt-sdk/x86_64_linux/include/VX/vx_types.h +++ b/prebuilt-sdk/x86_64_linux/include/VX/vx_types.h @@ -342,6 +342,10 @@ typedef struct _vx_tensorpatch_addressing_t * vx_trensor_addressing; */ typedef struct _vx_weights_biases_parameter_s * vx_weights_biases_parameter; +/*! \brief The object for stream processor + * \ingroup group_spinst + */ +typedef struct _vx_spinst_s * vx_spinst; /*! \brief A Boolean value. * This allows 0 to be FALSE, as it is in C, and any non-zero to be TRUE. @@ -470,6 +474,7 @@ enum vx_type_e { /* \todo add new object types here */ VX_TYPE_BFLOAT16 = 0x81A,/*!< \brief A \ref vx_bfloat16. */ + VX_TYPE_SPINST = 0x81B,/*!< \brief A \ref vx_spinst. */ VX_TYPE_INT4 = 0x81C,/*!< \brief A \ref signed 4bits tensor.. */ VX_TYPE_UINT4 = 0x81D,/*!< \brief A \ref unsigned 4bits tensor.. */ }; @@ -1021,6 +1026,8 @@ enum vx_node_attribute_e { VX_NODE_ATTRIBUTE_CONST_TENSOR_CACHE = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0x9, + VX_NODE_ATTRIBUTE_FOR_HW_QUALITY = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_NODE) + 0xA, + }; /*! \brief The parameter attributes list @@ -1290,6 +1297,9 @@ enum vx_tensor_attribute_e VX_TENSOR_LIFETIME = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_TENSOR) + 0x5, /*! \brief the value status of tensor. */ VX_TENSOR_VALUE = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_TENSOR) + 0x6, + /*XiaoMi project*/ + VX_TENSOR_INPUT_FOR_REFERENCE = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_TENSOR) + 0x7, + VX_TENSOR_MEMORY_ATTRIBUTE = VX_ATTRIBUTE_BASE(VX_ID_VIVANTE, VX_TYPE_TENSOR) + 0x8, }; /*! \brief The meta valid rectangle attributes. diff --git a/prebuilt-sdk/x86_64_linux/lib/libArchModelSw.so b/prebuilt-sdk/x86_64_linux/lib/libArchModelSw.so index 5f9565c344d12f93f03852e106000ece6204a92c..793d7a30360e47bb9cc1cf2e51095b6c701ea9fb 100755 GIT binary patch literal 410808 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