29 #include "tiny_dnn/core/params/conv_params.h"
34 inline nnp_convolution_algorithm nnp_algorithm() {
35 return nnp_convolution_algorithm_auto;
38 inline nnp_convolution_transform_strategy nnp_kts() {
39 return nnp_convolution_transform_strategy_tuple_based;
47 conv2d_op_nnpack(
const tensor_t& in_data,
51 const core::conv_params& params) {
53 nnp_status init_status = nnp_initialize();
54 if (init_status != nnp_status_success) {
55 throw nn_error(
"Cannot initialize NNPACK.");
59 const auto algorithm = nnp_algorithm();
60 const auto kernel_transform_strategy = nnp_kts();
62 const serial_size_t input_channels = params.in.depth_;
63 const serial_size_t output_channels = params.out.depth_;
67 const nnp_size input_size = {
68 static_cast<size_t>(params.in_padded.width_),
69 static_cast<size_t>(params.in_padded.height_)
72 const nnp_size kernel_size = {
73 static_cast<size_t>(params.weight.width_),
74 static_cast<size_t>(params.weight.height_)
83 const nnp_padding padding = {
84 static_cast<size_t>(dy/2),
85 static_cast<size_t>(dx/2),
86 static_cast<size_t>(dy/2),
87 static_cast<size_t>(dx/2)
90 const float* input_ptr =
reinterpret_cast<const float*
>(in_data[0].data());
91 const float* kernel_ptr =
reinterpret_cast<const float*
>(W.data());
92 const float* bias_ptr =
reinterpret_cast<const float*
>(bias.data());
93 const nnp_size stride= {
94 static_cast<size_t>(params.w_stride),
95 static_cast<size_t>(params.h_stride)
98 float* output_ptr = out_data[0].data();
101 const size_t num_mkl_threads = 1;
102 pthreadpool_t threadpool = pthreadpool_create(num_mkl_threads);
104 nnp_profile* profile =
nullptr;
107 nnp_convolution_inference(
109 kernel_transform_strategy,
123 if (status != nnp_status_success) {
124 throw nn_error(
"Could not succeed with nnp_convolution_inference");
128 pthreadpool_destroy(threadpool);
130 throw nn_error(
"TinyDNN has not been compiled with NNPACK support.");