diff --git a/src/layer/arm/convolution_arm.cpp b/src/layer/arm/convolution_arm.cpp index 2f8af3ff2..019c61b1e 100644 --- a/src/layer/arm/convolution_arm.cpp +++ b/src/layer/arm/convolution_arm.cpp @@ -395,12 +395,12 @@ int Convolution_arm::create_pipeline(const Option& opt) conv3x3s2_transform_kernel_neon(weight_data, weight_3x3s2_data, num_input, num_output); } - if (kernel_w == 1 && kernel_h == 1 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) + if (opt.use_sgemm_convolution && kernel_w == 1 && kernel_h == 1 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) { conv_im2col_sgemm_transform_kernel_neon(weight_data, weight_sgemm_data, num_input, num_output, maxk); } - if (kernel_w == 3 && kernel_h == 3 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) + if (opt.use_sgemm_convolution && kernel_w == 3 && kernel_h == 3 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) { conv_im2col_sgemm_transform_kernel_neon(weight_data, weight_sgemm_data, num_input, num_output, maxk); } @@ -853,8 +853,10 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option } else if (kernel_w == 1 && kernel_h == 1 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) { -// conv1x1s2_neon(bottom_blob_bordered, top_blob, weight_data, bias_data, opt); - conv_im2col_sgemm_neon(bottom_blob_bordered, top_blob, weight_sgemm_data, bias_data, kernel_w, kernel_h, stride_w, stride_h, opt); + if (opt.use_sgemm_convolution) + conv_im2col_sgemm_neon(bottom_blob_bordered, top_blob, weight_sgemm_data, bias_data, kernel_w, kernel_h, stride_w, stride_h, opt); + else + conv1x1s2_neon(bottom_blob_bordered, top_blob, weight_data, bias_data, opt); if (activation) { @@ -880,11 +882,10 @@ int Convolution_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Option } else if (kernel_w == 3 && kernel_h == 3 && dilation_w == 1 && dilation_h == 1 && stride_w == 2 && stride_h == 2) { -// conv3x3s2_neon(bottom_blob_bordered, top_blob, weight_data, bias_data, opt); - if (outw >=8 && outh >=8) - conv3x3s2_packed_neon(bottom_blob_bordered, top_blob, weight_3x3s2_data, bias_data, opt); - else + if (opt.use_sgemm_convolution && !(outw >=8 && outh >=8)) conv_im2col_sgemm_neon(bottom_blob_bordered, top_blob, weight_sgemm_data, bias_data, kernel_w, kernel_h, stride_w, stride_h, opt); + else + conv3x3s2_packed_neon(bottom_blob_bordered, top_blob, weight_3x3s2_data, bias_data, opt); if (activation) {