Coverage Report

Created: 2024-08-18 16:21

/home/liu/actions-runner/_work/ccv/ccv/lib/nnc/cmd/convolution/cpu_opt/_ccv_nnc_conv_cpu_gemm.c
Line
Count
Source (jump to first uncovered line)
1
#include "ccv.h"
2
#include "ccv_internal.h"
3
#include "nnc/ccv_nnc.h"
4
#include "nnc/ccv_nnc_easy.h"
5
#include "nnc/ccv_nnc_internal.h"
6
#include "../_ccv_nnc_conv_cpu_opt.h"
7
8
int _ccv_nnc_conv_forw_gemm_cpu_opt(const ccv_nnc_tensor_view_t* const a, const ccv_nnc_tensor_t* const w, const ccv_nnc_tensor_t* const bias, const ccv_nnc_hint_t hint, ccv_nnc_tensor_view_t* const b)
9
4
{
10
4
  assert(CCV_IS_TENSOR_CONTIGUOUS(a));
11
4
  assert(CCV_IS_TENSOR_CONTIGUOUS(w));
12
4
  assert(!bias || !CCV_IS_TENSOR_VIEW(bias));
13
4
  assert(CCV_IS_TENSOR_CONTIGUOUS(b));
14
4
  const int a_nd = ccv_nnc_tensor_nd(a->info.dim);
15
4
  assert(a_nd == CCV_NNC_MAX_DIM + 1 || a_nd == CCV_NNC_MAX_DIM + 2);
16
4
  const int* adim = (a_nd == CCV_NNC_MAX_DIM + 1) ? a->info.dim : 
a->info.dim + 10
;
17
4
  const int b_nd = ccv_nnc_tensor_nd(b->info.dim);
18
4
  assert(b_nd == CCV_NNC_MAX_DIM + 1 || b_nd == CCV_NNC_MAX_DIM + 2);
19
4
  const int* bdim = (b_nd == CCV_NNC_MAX_DIM + 1) ? b->info.dim : 
b->info.dim + 10
;
20
4
  assert(hint.border.begin[0] == 0 && hint.border.begin[1] == 0);
21
4
  assert(hint.border.end[0] == 0 && hint.border.end[1] == 0);
22
4
  assert(adim[0] == bdim[0]);
23
4
  assert(adim[1] == bdim[1]);
24
4
  assert(hint.stride.dim[0] <= 1 && hint.stride.dim[1] <= 1);
25
4
  ccv_dense_matrix_t am = ccv_dense_matrix(adim[0] * adim[1], adim[2], CCV_32F | CCV_C1, a->data.u8, 0);
26
4
  ccv_dense_matrix_t bm = ccv_dense_matrix(bdim[0] * bdim[1], bdim[2], CCV_32F | CCV_C1, b->data.u8, 0);
27
  // copy bias into each row.
28
4
  int i;
29
4
  if (bias)
30
104
    
for (i = 0; 4
i < bm.rows;
i++100
)
31
100
      memcpy(bm.data.f32 + i * bdim[2], bias->data.f32, sizeof(float) * bdim[2]);
32
4
  ccv_dense_matrix_t* dbm = &bm;
33
4
  ccv_dense_matrix_t wm = ccv_dense_matrix(bdim[2], adim[2], CCV_32F | CCV_C1, w->data.u8, 0);
34
4
  if (bias)
35
4
    ccv_gemm(&am, &wm, 1, dbm, 1, CCV_B_TRANSPOSE, (ccv_matrix_t**)&dbm, 0); // supply b as matrix C is allowed
36
0
  else
37
0
    ccv_gemm(&am, &wm, 1, 0, 0, CCV_B_TRANSPOSE, (ccv_matrix_t**)&dbm, 0); // supply b as matrix C is allowed
38
4
  return CCV_NNC_EXEC_SUCCESS;
39
4
}