- Timestamp:
- Sep 14, 2020, 6:36:03 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub_riscv/trunk/app_iothub_client/kendryte/kpu.h
r453 r458 24 24 #endif 25 25 26 #define kpu_matmul_begin kpu_conv2d_output27 26 #define IOMEM 0x40000000 27 #define dmac_channel_number_t int 28 28 29 29 typedef int (*plic_irq_callback_t)(void *ctx); … … 31 31 typedef struct 32 32 { 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 33 union 34 { 35 uint64_t reg; 36 struct 37 { 38 uint64_t int_en : 1; 39 uint64_t ram_flag : 1; 40 uint64_t full_add : 1; 41 uint64_t depth_wise_layer : 1; 42 uint64_t reserved : 60; 43 } data; 44 } interrupt_enabe; 45 46 union 47 { 48 uint64_t reg; 49 struct 50 { 51 uint64_t image_src_addr : 15; 52 uint64_t reserved0 : 17; 53 uint64_t image_dst_addr : 15; 54 uint64_t reserved1 : 17; 55 } data; 56 } image_addr; 57 58 union 59 { 60 uint64_t reg; 61 struct 62 { 63 uint64_t i_ch_num : 10; 64 uint64_t reserved0 : 22; 65 uint64_t o_ch_num : 10; 66 uint64_t reserved1 : 6; 67 uint64_t o_ch_num_coef : 10; 68 uint64_t reserved2 : 6; 69 } data; 70 } image_channel_num; 71 72 union 73 { 74 uint64_t reg; 75 struct 76 { 77 uint64_t i_row_wid : 10; 78 uint64_t i_col_high : 9; 79 uint64_t reserved0 : 13; 80 uint64_t o_row_wid : 10; 81 uint64_t o_col_high : 9; 82 uint64_t reserved1 : 13; 83 } data; 84 } image_size; 85 86 union 87 { 88 uint64_t reg; 89 struct 90 { 91 uint64_t kernel_type : 3; 92 uint64_t pad_type : 1; 93 uint64_t pool_type : 4; 94 uint64_t first_stride : 1; 95 uint64_t bypass_conv : 1; 96 uint64_t load_para : 1; 97 uint64_t reserved0 : 5; 98 uint64_t dma_burst_size : 8; 99 uint64_t pad_value : 8; 100 uint64_t bwsx_base_addr : 32; 101 } data; 102 } kernel_pool_type_cfg; 103 104 union 105 { 106 uint64_t reg; 107 struct 108 { 109 uint64_t load_coor : 1; 110 uint64_t load_time : 6; 111 uint64_t reserved0 : 8; 112 uint64_t para_size : 17; 113 uint64_t para_start_addr : 32; 114 } data; 115 } kernel_load_cfg; 116 117 union 118 { 119 uint64_t reg; 120 struct 121 { 122 uint64_t coef_column_offset : 4; 123 uint64_t coef_row_offset : 12; 124 uint64_t reserved0 : 48; 125 } data; 126 } kernel_offset; 127 128 union 129 { 130 uint64_t reg; 131 struct 132 { 133 uint64_t channel_switch_addr : 15; 134 uint64_t reserved : 1; 135 uint64_t row_switch_addr : 4; 136 uint64_t coef_size : 8; 137 uint64_t coef_group : 3; 138 uint64_t load_act : 1; 139 uint64_t active_addr : 32; 140 } data; 141 } kernel_calc_type_cfg; 142 143 union 144 { 145 uint64_t reg; 146 struct 147 { 148 uint64_t wb_channel_switch_addr : 15; 149 uint64_t reserved0 : 1; 150 uint64_t wb_row_switch_addr : 4; 151 uint64_t wb_group : 3; 152 uint64_t reserved1 : 41; 153 } data; 154 } write_back_cfg; 155 156 union 157 { 158 uint64_t reg; 159 struct 160 { 161 uint64_t shr_w : 4; 162 uint64_t shr_x : 4; 163 uint64_t arg_w : 24; 164 uint64_t arg_x : 24; 165 uint64_t reserved0 : 8; 166 } data; 167 } conv_value; 168 169 union 170 { 171 uint64_t reg; 172 struct 173 { 174 uint64_t arg_add : 40; 175 uint64_t reserved : 24; 176 } data; 177 } conv_value2; 178 179 union 180 { 181 uint64_t reg; 182 struct 183 { 184 uint64_t send_data_out : 1; 185 uint64_t reserved : 15; 186 uint64_t channel_byte_num : 16; 187 uint64_t dma_total_byte : 32; 188 } data; 189 } dma_parameter; 190 190 } kpu_layer_argument_t; 191 191 192 192 typedef struct 193 193 { 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 194 union 195 { 196 uint64_t reg; 197 struct 198 { 199 uint64_t shift_number : 8; 200 uint64_t y_mul : 16; 201 uint64_t x_start : 36; 202 } data; 203 } activate_para[16]; 204 205 union 206 { 207 uint64_t reg; 208 struct 209 { 210 uint8_t result_bias[8]; 211 } data; 212 } activate_para_bias0; 213 214 union 215 { 216 uint64_t reg; 217 struct 218 { 219 uint8_t result_bias[8]; 220 } data; 221 } activate_para_bias1; 222 222 } kpu_activate_table_t; 223 223 224 224 typedef struct 225 225 { 226 227 228 229 230 231 232 233 234 235 226 union 227 { 228 uint64_t reg; 229 struct 230 { 231 uint64_t norm_mul : 24; 232 uint64_t norm_add : 32; 233 uint64_t norm_shift : 4; 234 } data; 235 } batchnorm; 236 236 } kpu_batchnorm_argument_t; 237 237 238 238 typedef struct 239 239 { 240 241 242 243 244 245 246 247 240 union 241 { 242 uint64_t reg; 243 struct 244 { 245 uint16_t weight[9]; 246 } data; 247 } weights; 248 248 } kpu_weights_kernel_16_3x3_t; 249 249 250 250 typedef struct 251 251 { 252 253 254 255 252 uint64_t calc_done_int : 1; 253 uint64_t layer_cfg_almost_empty_int : 1; 254 uint64_t layer_cfg_almost_full_int : 1; 255 uint64_t reserved : 61; 256 256 } kpu_config_interrupt_t; 257 257 258 258 typedef struct 259 259 { 260 261 262 260 uint64_t fifo_full_threshold : 4; 261 uint64_t fifo_empty_threshold : 4; 262 uint64_t reserved : 56; 263 263 } kpu_config_fifo_threshold_t; 264 264 265 265 typedef struct 266 266 { 267 268 269 270 271 272 267 uint64_t dma_fifo_flush_n : 1; 268 uint64_t gs_fifo_flush_n : 1; 269 uint64_t cfg_fifo_flush_n : 1; 270 uint64_t cmd_fifo_flush_n : 1; 271 uint64_t resp_fifo_flush_n : 1; 272 uint64_t reserved : 59; 273 273 } kpu_config_fifo_ctrl_t; 274 274 275 275 typedef struct 276 276 { 277 278 277 uint64_t eight_bit_mode : 1; 278 uint64_t reserved : 63; 279 279 } kpu_config_eight_bit_mode_t; 280 280 281 281 typedef struct 282 282 { 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 283 volatile uint64_t layer_argument_fifo; 284 285 volatile union 286 { 287 uint64_t reg; 288 kpu_config_interrupt_t data; 289 } interrupt_status; 290 291 volatile union 292 { 293 uint64_t reg; 294 kpu_config_interrupt_t data; 295 } interrupt_raw; 296 297 volatile union 298 { 299 uint64_t reg; 300 kpu_config_interrupt_t data; 301 } interrupt_mask; 302 303 volatile union 304 { 305 uint64_t reg; 306 kpu_config_interrupt_t data; 307 } interrupt_clear; 308 309 volatile union 310 { 311 uint64_t reg; 312 kpu_config_fifo_threshold_t data; 313 } fifo_threshold; 314 315 volatile uint64_t fifo_data_out; 316 317 volatile union 318 { 319 uint64_t reg; 320 kpu_config_fifo_ctrl_t data; 321 } fifo_ctrl; 322 323 volatile union 324 { 325 uint64_t reg; 326 kpu_config_eight_bit_mode_t data; 327 } eight_bit_mode; 328 328 } kpu_config_t; 329 329 330 #define dmac_channel_number_t int 331 332 typedef struct 333 { 334 kpu_layer_argument_t *layers; 335 kpu_layer_argument_t *remain_layers; 336 plic_irq_callback_t callback; 337 void *ctx; 338 uint64_t *src; 339 uint64_t *dst; 340 uint32_t src_length; 341 uint32_t dst_length; 342 uint32_t layers_length; 343 uint32_t remain_layers_length; 344 dmac_channel_number_t dma_ch; 345 uint32_t eight_bit_mode; 346 float output_scale; 347 float output_bias; 348 float input_scale; 349 float input_bias; 350 } kpu_task_t; 351 352 typedef struct 353 { 354 uint32_t version; 355 uint32_t flags; 356 uint32_t arch; 357 uint32_t layers_length; 358 uint32_t max_start_address; 359 uint32_t main_mem_usage; 360 uint32_t output_count; 330 typedef struct 331 { 332 uint32_t version; 333 uint32_t flags; 334 uint32_t arch; 335 uint32_t layers_length; 336 uint32_t max_start_address; 337 uint32_t main_mem_usage; 338 uint32_t output_count; 361 339 } kpu_kmodel_header_t; 362 340 363 341 typedef struct 364 342 { 365 366 367 368 369 343 uint32_t version; 344 uint32_t flags; 345 uint32_t layers_length; 346 uint32_t max_start_address; 347 uint32_t layers_argument_start; 370 348 } kpu_model_header_t; 371 349 372 350 typedef struct 373 351 { 374 375 352 uint32_t address; 353 uint32_t size; 376 354 } kpu_model_output_t; 377 355 378 356 typedef enum 379 357 { 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 358 KL_INVALID = 0, 359 KL_ADD, 360 KL_QUANTIZED_ADD, 361 KL_GLOBAL_MAX_POOL2D, 362 KL_QUANTIZED_GLOBAL_MAX_POOL2D, 363 KL_GLOBAL_AVERAGE_POOL2D, 364 KL_QUANTIZED_GLOBAL_AVERAGE_POOL2D, 365 KL_MAX_POOL2D, 366 KL_QUANTIZED_MAX_POOL2D, 367 KL_AVERAGE_POOL2D, 368 KL_QUANTIZED_AVERAGE_POOL2D, 369 KL_QUANTIZE, 370 KL_DEQUANTIZE, 371 KL_REQUANTIZE, 372 KL_L2_NORMALIZATION, 373 KL_SOFTMAX, 374 KL_CONCAT, 375 KL_QUANTIZED_CONCAT, 376 KL_FULLY_CONNECTED, 377 KL_QUANTIZED_FULLY_CONNECTED, 378 KL_TENSORFLOW_FLATTEN, 379 KL_QUANTIZED_TENSORFLOW_FLATTEN, 380 KL_RESIZE_NEAREST_NEIGHBOR, 381 KL_QUANTIZED_RESIZE_NEAREST_NEIGHBOR, 382 KL_CHANNELWISE_DEQUANTIZE, 383 KL_LOGISTIC, 384 KL_K210_CONV = 10240, 385 KL_K210_ADD_PADDING, 386 KL_K210_REMOVE_PADDING, 387 KL_K210_UPLOAD 410 388 } kpu_model_layer_type_t; 411 389 412 390 typedef struct 413 391 { 414 415 392 uint32_t type; 393 uint32_t body_size; 416 394 } kpu_model_layer_header_t; 417 395 418 396 typedef enum 419 397 { 420 421 398 KLF_NONE = 0, 399 KLF_MAIN_MEM_OUT = 1 422 400 } kpu_model_layer_flags_t; 423 401 424 402 typedef enum 425 403 { 426 427 404 KLP_SAME = 0, 405 KLP_VALID = 1 428 406 } kpu_model_padding_t; 429 407 430 408 typedef enum 431 409 { 432 433 434 410 KLA_LINEAR = 0, 411 KLA_RELU = 1, 412 KLA_RELU6 = 2 435 413 } kpu_model_activation_t; 436 414 437 415 typedef struct 438 416 { 439 440 417 float scale; 418 float bias; 441 419 } kpu_model_quant_param_t; 442 420 443 421 typedef struct 444 422 { 445 446 447 423 uint32_t width; 424 uint32_t height; 425 uint32_t channels; 448 426 } kpu_model_shape_t; 449 427 450 428 typedef struct 451 429 { 452 453 430 uint32_t start; 431 uint32_t size; 454 432 } kpu_model_memory_range_t; 455 433 456 434 typedef struct 457 435 { 458 459 460 461 462 463 436 uint32_t flags; 437 uint32_t main_mem_out_address; 438 uint32_t layer_offset; 439 uint32_t weights_offset; 440 uint32_t bn_offset; 441 uint32_t act_offset; 464 442 } kpu_model_conv_layer_argument_t; 465 443 466 444 typedef struct 467 445 { 468 469 470 471 472 446 uint32_t flags; 447 uint32_t main_mem_in_a_address; 448 uint32_t main_mem_in_b_address; 449 uint32_t main_mem_out_address; 450 uint32_t count; 473 451 } kpu_model_add_layer_argument_t; 474 452 475 453 typedef struct 476 454 { 477 478 479 480 481 482 483 484 485 486 487 488 489 490 455 uint32_t flags; 456 uint32_t main_mem_in_a_address; 457 uint32_t main_mem_in_b_address; 458 uint32_t main_mem_out_address; 459 uint32_t count; 460 int32_t in_a_offset; 461 int32_t in_a_mul; 462 int32_t in_a_shift; 463 int32_t in_b_offset; 464 int32_t in_b_mul; 465 int32_t in_b_shift; 466 int32_t out_offset; 467 int32_t out_mul; 468 int32_t out_shift; 491 469 } kpu_model_quant_add_layer_argument_t; 492 470 493 471 typedef struct 494 472 { 495 496 497 498 499 473 uint32_t flags; 474 uint32_t main_mem_in_address; 475 uint32_t main_mem_out_address; 476 uint32_t kernel_size; 477 uint32_t channels; 500 478 } kpu_model_gap2d_layer_argument_t; 501 479 502 480 typedef struct 503 481 { 504 505 506 507 508 509 510 511 512 513 514 482 uint32_t flags; 483 uint32_t main_mem_in_address; 484 uint32_t main_mem_out_address; 485 kpu_model_shape_t in_shape; 486 kpu_model_shape_t out_shape; 487 uint32_t kernel_width; 488 uint32_t kernel_height; 489 uint32_t stride_width; 490 uint32_t stride_height; 491 uint32_t padding_width; 492 uint32_t padding_height; 515 493 } kpu_model_quant_max_pool2d_layer_argument_t; 516 494 517 495 typedef struct 518 496 { 519 520 521 522 523 524 525 526 527 528 529 530 497 uint32_t flags; 498 uint32_t main_mem_in_address; 499 uint32_t main_mem_out_address; 500 kpu_model_shape_t in_shape; 501 kpu_model_shape_t out_shape; 502 uint32_t kernel_width; 503 uint32_t kernel_height; 504 uint32_t stride_width; 505 uint32_t stride_height; 506 uint32_t padding_width; 507 uint32_t padding_height; 508 kpu_model_activation_t act; 531 509 } kpu_model_ave_pool2d_layer_argument_t; 532 510 533 511 typedef struct 534 512 { 535 536 537 538 539 513 uint32_t flags; 514 uint32_t main_mem_in_address; 515 uint32_t mem_out_address; 516 uint32_t count; 517 kpu_model_quant_param_t quant_param; 540 518 } kpu_model_quantize_layer_argument_t; 541 519 542 520 typedef struct 543 521 { 544 545 546 547 548 522 uint32_t flags; 523 uint32_t main_mem_in_address; 524 uint32_t main_mem_out_address; 525 uint32_t count; 526 kpu_model_quant_param_t quant_param; 549 527 } kpu_model_dequantize_layer_argument_t; 550 528 551 529 typedef struct 552 530 { 553 554 555 556 557 531 uint32_t flags; 532 uint32_t main_mem_in_address; 533 uint32_t main_mem_out_address; 534 uint32_t count; 535 uint8_t table[256]; 558 536 } kpu_model_requantize_layer_argument_t; 559 537 560 538 typedef struct 561 539 { 562 563 564 565 540 uint32_t flags; 541 uint32_t main_mem_in_address; 542 uint32_t kpu_mem_out_address; 543 uint32_t channels; 566 544 } kpu_model_add_padding_layer_argument_t; 567 545 568 546 typedef struct 569 547 { 570 571 572 573 548 uint32_t flags; 549 uint32_t main_mem_in_address; 550 uint32_t main_mem_out_address; 551 uint32_t channels; 574 552 } kpu_model_remove_padding_layer_argument_t; 575 553 576 554 typedef struct 577 555 { 578 579 580 581 582 583 556 uint32_t flags; 557 uint32_t main_mem_in_address; 558 uint32_t kpu_mem_out_address; 559 uint32_t width; 560 uint32_t height; 561 uint32_t channels; 584 562 } kpu_model_upload_layer_argument_t; 585 563 586 564 typedef struct 587 565 { 588 589 590 591 566 uint32_t flags; 567 uint32_t main_mem_in_address; 568 uint32_t main_mem_out_address; 569 uint32_t channels; 592 570 } kpu_model_l2_norm_layer_argument_t; 593 571 594 572 typedef struct 595 573 { 596 597 598 599 574 uint32_t flags; 575 uint32_t main_mem_in_address; 576 uint32_t main_mem_out_address; 577 uint32_t channels; 600 578 } kpu_model_softmax_layer_argument_t; 601 579 602 580 typedef struct 603 581 { 604 605 606 607 582 uint32_t flags; 583 uint32_t main_mem_out_address; 584 uint32_t input_count; 585 kpu_model_memory_range_t inputs_mem[0]; 608 586 } kpu_model_concat_layer_argument_t; 609 587 610 588 typedef struct 611 589 { 612 613 614 615 616 617 618 590 uint32_t flags; 591 uint32_t main_mem_in_address; 592 uint32_t main_mem_out_address; 593 uint32_t in_channels; 594 uint32_t out_channels; 595 kpu_model_activation_t act; 596 float weights[0]; 619 597 } kpu_model_fully_connected_layer_argument_t; 620 598 621 599 typedef struct 622 600 { 623 624 625 626 601 uint32_t flags; 602 uint32_t main_mem_in_address; 603 uint32_t main_mem_out_address; 604 kpu_model_shape_t shape; 627 605 } kpu_model_tf_flatten_layer_argument_t; 628 606 629 607 typedef struct 630 608 { 631 632 633 634 635 636 637 609 uint32_t flags; 610 uint32_t main_mem_in_address; 611 uint32_t main_mem_out_address; 612 kpu_model_shape_t in_shape; 613 uint32_t out_width; 614 uint32_t out_height; 615 uint32_t align_corners; 638 616 } kpu_model_resize_nearest_neighbor_layer_argument_t; 639 617 640 618 typedef struct 641 619 { 642 643 644 645 646 647 648 620 uint32_t flags; 621 uint32_t main_mem_in_address; 622 uint32_t main_mem_out_address; 623 kpu_model_shape_t in_shape; 624 uint32_t out_width; 625 uint32_t out_height; 626 uint32_t align_corners; 649 627 } kpu_model_quant_resize_nearest_neighbor_layer_argument_t; 650 628 651 629 typedef struct 652 630 { 653 654 655 656 657 658 631 uint32_t flags; 632 uint32_t main_mem_in_address; 633 uint32_t main_mem_out_address; 634 uint32_t channels; 635 uint32_t channel_size; 636 kpu_model_quant_param_t quant_params[0]; 659 637 } kpu_model_channelwise_dequant_argument_t; 660 638 661 639 typedef struct 662 640 { 663 664 665 666 641 uint32_t flags; 642 uint32_t main_mem_in_address; 643 uint32_t main_mem_out_address; 644 uint32_t channels; 667 645 } kpu_model_logistic_layer_argument_t; 668 646 … … 671 649 typedef struct 672 650 { 673 int is_nncase; 674 675 union 676 { 677 struct 678 { 679 const uint8_t *model_buffer; 680 uint8_t *main_buffer; 681 uint32_t output_count; 682 const kpu_model_output_t *outputs; 683 const kpu_model_layer_header_t *layer_headers; 684 const uint8_t *body_start; 685 uint32_t layers_length; 686 volatile uint32_t current_layer; 687 const uint8_t *volatile current_body; 688 dmac_channel_number_t dma_ch; 689 kpu_done_callback_t done_callback; 690 void *userdata; 691 }; 692 693 struct 694 { 695 void* nncase_ctx; 696 }; 697 }; 651 union 652 { 653 struct 654 { 655 const uint8_t *model_buffer; 656 uint8_t *main_buffer; 657 uint32_t output_count; 658 const kpu_model_output_t *outputs; 659 const kpu_model_layer_header_t *layer_headers; 660 const uint8_t *body_start; 661 uint32_t layers_length; 662 volatile uint32_t current_layer; 663 const uint8_t *volatile current_body; 664 dmac_channel_number_t dma_ch; 665 kpu_done_callback_t done_callback; 666 void *userdata; 667 }; 668 669 struct 670 { 671 void* nncase_ctx; 672 }; 673 }; 698 674 } kpu_model_context_t; 699 675 700 676 typedef struct 701 677 { 702 703 704 705 706 707 708 678 uint32_t weigths_offset; 679 uint32_t bn_offset; 680 uint32_t act_offset; 681 float input_scale; 682 float input_bias; 683 float output_scale; 684 float output_bias; 709 685 } kpu_model_layer_metadata_t; 710 686 711 687 typedef struct _quantize_param 712 688 { 713 714 689 float scale; 690 float bias; 715 691 } quantize_param_t; 716 692 717 693 extern volatile kpu_config_t *const kpu; 718 694 719 /** 720 * @brief Modle complier init kpu handler 721 * 722 * @param[in] task Kpu handler 723 * 724 * @return Kpu handler 725 */ 726 extern kpu_task_t *kpu_task_init(kpu_task_t *task); 727 728 /** 729 * @brief Kpu run for AI 730 * 731 * @param[in] task Kpu handler 732 * @param[in] dma_ch DMA for kpu 733 * @param[in] src The picture data 734 * @param[in] dest The result of kpu 735 * @param[in] callback The callback of kpu 736 * 737 * @return result 738 * - 0 Success 739 * - Other Fail.Kpu is busy. 740 */ 741 int kpu_run(kpu_task_t *task, dmac_channel_number_t dma_ch, const void *src, void *dest, plic_irq_callback_t callback); 742 743 /** 744 * @brief Get kpu result buf 745 * 746 * @param[in] task Kpu handler 747 * 748 * @return Kpu result buf 749 */ 750 uint8_t *kpu_get_output_buf(kpu_task_t *task); 751 752 /** 753 * @brief Release kpu output buf 754 * 755 * @param[in] output_buf Kpu output buf 756 * 757 */ 758 void kpu_release_output_buf(uint8_t *output_buf); 759 760 /** 761 * @brief Kpu run for AI 762 * 763 * @param[in] task Kpu handler 764 * 765 * @return result 766 * - 0 Success 767 * - Other Fail.Kpu is busy. 768 */ 769 int kpu_start(kpu_task_t *task); 770 771 /** 772 * @brief Initialize kpu handler 773 * 774 * @param[in] task Kpu handler 775 * 776 * @return result 777 * - 0 Success 778 * - Other Fail. 779 */ 780 int kpu_single_task_init(kpu_task_t *task); 781 782 /** 783 * @brief Uninitialize kpu handler 784 * 785 * @param[in] task Kpu handler 786 * 787 * @return result 788 * - 0 Success 789 * - Other Fail. 790 */ 791 int kpu_single_task_deinit(kpu_task_t *task); 792 793 /** 794 * @brief Load kmodel and init kpu task 795 * 796 * @param[in] task Kpu handler 797 * @param[in] buffer Kmodel 798 * @param[in] meta Test data 799 * 800 * @return result 801 * - 0 Success 802 * - Other Fail. 803 */ 804 int kpu_model_load_from_buffer(kpu_task_t *task, uint8_t *buffer, kpu_model_layer_metadata_t **meta); 805 806 /** 807 * @brief Kpu initialize 808 * 809 * @param[in] eight_bit_mode 0:16bit mode 1:8bit mode 810 * @param[in] callback Callback of kpu 811 * @param[in] userdata Data of callback 812 * 813 */ 814 void kpu_init(int eight_bit_mode, plic_irq_callback_t callback, void *userdata); 815 816 /** 817 * @brief Kpu input data by dma 818 * 819 * @param[in] layer Kpu task layer 820 * @param[in] src Image data 821 * @param[in] dma_ch Dmac channel 822 * @param[in] callback Dmac complete callback 823 * @param[in] userdata Data of callback 824 * 825 */ 826 void kpu_input_dma(const kpu_layer_argument_t *layer, const uint8_t *src, dmac_channel_number_t dma_ch, plic_irq_callback_t callback, void *userdata); 827 828 /** 829 * @brief Kpu input data by cpu 830 * 831 * @param[in] layer Kpu task layer 832 * @param[in] src Image data 833 * @param[in] width Image width 834 * @param[in] height Image heigth 835 * @param[in] channels Color channel, RGB is 3 836 * 837 */ 838 void kpu_input_with_padding(kpu_layer_argument_t *layer, const uint8_t *src, int width, int height, int channels); 839 840 /** 841 * @brief Kpu run only one layer 842 * 843 * @param[in] layer Kpu task layer 844 * 845 */ 846 void kpu_conv2d(kpu_layer_argument_t *layer); 847 848 /** 849 * @brief Kpu run only one layer then get the result by dma 850 * 851 * @param[in] layer Kpu task layer 852 * @param[in] dma_ch Dmac channel 853 * @param[in] dest Result 854 * @param[in] callback Dmac complete callback 855 * @param[in] userdata Data of callback 856 * 857 */ 858 void kpu_conv2d_output(kpu_layer_argument_t *layer, dmac_channel_number_t dma_ch, uint8_t *dest, plic_irq_callback_t callback, void *userdata); 859 860 /** 861 * @brief Kpu pooling 862 * 863 * @param[in] src Source 864 * @param[in] src_param Source param 865 * @param[in] kernel_size Kernel size, 7*7 is 49 866 * @param[in] channels Channels 867 * @param[in] dest Dest 868 * @param[in] dest_param Dest param 869 * 870 */ 871 void kpu_global_average_pool(const uint8_t *src, const quantize_param_t *src_param, int kernel_size, int channels, uint8_t *dest, const quantize_param_t *dest_param); 872 873 /** 874 * @brief Kpu pooling 875 * 876 * @param[in] src Source 877 * @param[in] src_param Source param 878 * @param[in] kernel_size Kernel size, 7*7 is 49 879 * @param[in] channels Channels 880 * @param[in] dest Dest 881 * 882 */ 883 void kpu_global_average_pool_float(const uint8_t *src, const quantize_param_t *src_param, int kernel_size, int channels, float *dest); 884 885 /** 886 * @brief Kpu fullly connected by cpu 887 * 888 * @param[in] src Source 889 * @param[in] weights Weight 890 * @param[in] biases Biases 891 * @param[in] dest Dest 892 * @param[in] input_channels Input channels 893 * @param[in] output_channels Output channels 894 * 895 */ 896 void kpu_fully_connected(const float *src, const float *weights, const float *biases, float *dest, int input_channels, int output_channels); 897 898 /** 899 * @brief Kpu matrix multiplication 900 * 901 * @param[in] src Source 902 * @param[in] channels Channels 903 * @param[in] dest Dest 904 * @param[in] dest_param Dest param 905 * 906 */ 907 void kpu_matmul_end(const uint8_t *src, int channels, float *dest, const quantize_param_t *dest_param); 908 909 /** 910 * @brief Kpu dequantize 911 * 912 * @param[in] src Source 913 * @param[in] src_param Source param 914 * @param[in] count Dequantize count 915 * @param[in] dest Dest 916 * 917 */ 918 void kpu_dequantize(const uint8_t *src, const quantize_param_t *src_param, size_t count, float *dest); 919 920 /** 921 * @brief Kpu load kmodel 922 * 923 * @param[in] ctx Kmodel object 924 * @param[in] buffer Kmodel buffer 925 * 926 * @return result 927 * - 0 Success 928 * - Other Fail. 929 */ 695 ER kpu_init(kpu_model_context_t *ctx); 930 696 int kpu_load_kmodel(kpu_model_context_t *ctx, const uint8_t *buffer); 931 932 /**933 * @brief Kpu free kmodel buffer934 *935 * @param[in] ctx kmodel object936 *937 */938 void kpu_model_free(kpu_model_context_t *ctx);939 940 /**941 * @brief Kpu load kmodel942 *943 * @param[in] ctx Kmodel object944 * @param[in] index Output index945 * @param[in] data Output data946 * @param[in] size Output data size947 *948 * @return result949 * - 0 Success950 * - Other Fail.951 */952 697 int kpu_get_output(kpu_model_context_t *ctx, uint32_t index, uint8_t **data, size_t *size); 953 954 /**955 * @brief Kpu run kmodel956 *957 * @param[in] ctx Kmodel object958 * @param[in] src Source data959 * @param[in] dma_ch Dma channel960 * @param[in] done_callback Kpu complete callback961 * @param[in] userdata Data of callback962 *963 * @return result964 * - 0 Success965 * - Other Fail.966 */967 698 int kpu_run_kmodel(kpu_model_context_t *ctx, const uint8_t *src, dmac_channel_number_t dma_ch, kpu_done_callback_t done_callback, void *userdata); 699 ER kpu_wait_done(kpu_model_context_t *ctx, TMO tmout); 968 700 969 701 #ifdef __cplusplus
Note:
See TracChangeset
for help on using the changeset viewer.