| @@ -88,8 +88,8 @@ macro(ncnn_add_layer class) | |||
| if(WITH_LAYER_${name}_vulkan) | |||
| set(layer_declaration "${layer_declaration}#include \"layer/vulkan/${name}_vulkan.h\"\n") | |||
| set(layer_declaration_class "${layer_declaration_class}, virtual public ${class}_vulkan") | |||
| set(create_pipeline_content "${create_pipeline_content} if (opt.use_vulkan_compute) { int ret = ${class}_vulkan::create_pipeline(opt); if (ret) return ret; }\n") | |||
| set(destroy_pipeline_content " if (opt.use_vulkan_compute) { int ret = ${class}_vulkan::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}") | |||
| set(create_pipeline_content "${create_pipeline_content} if (vkdev) { int ret = ${class}_vulkan::create_pipeline(opt); if (ret) return ret; }\n") | |||
| set(destroy_pipeline_content " if (vkdev) { int ret = ${class}_vulkan::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}") | |||
| file(GLOB_RECURSE SHADER_SRCS "layer/vulkan/shader/${name}.comp") | |||
| file(GLOB_RECURSE SHADER_SUBSRCS "layer/vulkan/shader/${name}_*.comp") | |||
| @@ -35,9 +35,6 @@ int Concat_arm::create_pipeline(const Option& opt) | |||
| if (opt.use_packing_layout) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| { | |||
| packing_pack4 = ncnn::create_layer(ncnn::LayerType::Packing); | |||
| @@ -46,7 +43,7 @@ int Concat_arm::create_pipeline(const Option& opt) | |||
| packing_pack4->load_param(pd); | |||
| packing_pack4->create_pipeline(opt_cpu); | |||
| packing_pack4->create_pipeline(opt); | |||
| } | |||
| } | |||
| @@ -61,13 +58,9 @@ int Concat_arm::destroy_pipeline(const Option& opt) | |||
| if (opt.use_packing_layout) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (packing_pack4) | |||
| { | |||
| packing_pack4->destroy_pipeline(opt_cpu); | |||
| packing_pack4->destroy_pipeline(opt); | |||
| delete packing_pack4; | |||
| packing_pack4 = 0; | |||
| } | |||
| @@ -95,9 +95,7 @@ int Convolution_arm::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| const int maxk = kernel_w * kernel_h; | |||
| @@ -393,9 +391,7 @@ int Convolution_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| if (activation) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| @@ -47,9 +47,6 @@ ConvolutionDepthWise_arm::ConvolutionDepthWise_arm() | |||
| int ConvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation_type == 1) | |||
| { | |||
| activation = ncnn::create_layer(ncnn::LayerType::ReLU); | |||
| @@ -84,7 +81,7 @@ int ConvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| // create Convolution op for each group | |||
| @@ -193,7 +190,7 @@ int ConvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| op->load_model(ModelBinFromMatArray(weights)); | |||
| } | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| group_ops[g] = op; | |||
| } | |||
| @@ -203,19 +200,16 @@ int ConvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| int ConvolutionDepthWise_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation) | |||
| { | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| for (int i=0; i<(int)group_ops.size(); i++) | |||
| { | |||
| group_ops[i]->destroy_pipeline(opt_cpu); | |||
| group_ops[i]->destroy_pipeline(opt); | |||
| delete group_ops[i]; | |||
| } | |||
| group_ops.clear(); | |||
| @@ -73,9 +73,7 @@ int Deconvolution_arm::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| const int maxk = kernel_w * kernel_h; | |||
| @@ -264,9 +262,7 @@ int Deconvolution_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| if (activation) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| @@ -36,9 +36,6 @@ DeconvolutionDepthWise_arm::DeconvolutionDepthWise_arm() | |||
| int DeconvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation_type == 1) | |||
| { | |||
| activation = ncnn::create_layer(ncnn::LayerType::ReLU); | |||
| @@ -73,7 +70,7 @@ int DeconvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| // create Deconvolution op for each group | |||
| @@ -167,7 +164,7 @@ int DeconvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| op->load_model(ModelBinFromMatArray(weights)); | |||
| } | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| group_ops[g] = op; | |||
| } | |||
| @@ -177,19 +174,16 @@ int DeconvolutionDepthWise_arm::create_pipeline(const Option& opt) | |||
| int DeconvolutionDepthWise_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation) | |||
| { | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| for (int i=0; i<(int)group_ops.size(); i++) | |||
| { | |||
| group_ops[i]->destroy_pipeline(opt_cpu); | |||
| group_ops[i]->destroy_pipeline(opt); | |||
| delete group_ops[i]; | |||
| } | |||
| group_ops.clear(); | |||
| @@ -48,10 +48,7 @@ int InnerProduct_arm::create_pipeline(const Option& opt) | |||
| flatten->load_param(pd); | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| flatten->create_pipeline(opt_cpu); | |||
| flatten->create_pipeline(opt); | |||
| } | |||
| } // opt.use_packing_layout | |||
| @@ -64,10 +61,7 @@ int InnerProduct_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| if (flatten) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| flatten->destroy_pipeline(opt_cpu); | |||
| flatten->destroy_pipeline(opt); | |||
| delete flatten; | |||
| flatten = 0; | |||
| } | |||
| @@ -44,10 +44,7 @@ int Reshape_arm::create_pipeline(const Option& opt) | |||
| flatten->load_param(pd); | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| flatten->create_pipeline(opt_cpu); | |||
| flatten->create_pipeline(opt); | |||
| } | |||
| #endif // __ARM_NEON | |||
| @@ -58,10 +55,7 @@ int Reshape_arm::destroy_pipeline(const Option& opt) | |||
| { | |||
| if (flatten) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| flatten->destroy_pipeline(opt_cpu); | |||
| flatten->destroy_pipeline(opt); | |||
| delete flatten; | |||
| flatten = 0; | |||
| } | |||
| @@ -77,9 +77,6 @@ int Convolution::load_model(const ModelBin& mb) | |||
| int Convolution::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| use_int8_inference = opt.use_int8_inference; | |||
| if (int8_scale_term == 0) | |||
| @@ -113,7 +110,7 @@ int Convolution::create_pipeline(const Option& opt) | |||
| op->load_param(pd); | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| ncnn::Option opt; | |||
| opt.blob_allocator = int8_weight_data.allocator; | |||
| @@ -138,7 +135,7 @@ int Convolution::create_pipeline(const Option& opt) | |||
| quantize->load_param(pd); | |||
| quantize->create_pipeline(opt_cpu); | |||
| quantize->create_pipeline(opt); | |||
| } | |||
| dequantize_ops.resize(num_output); | |||
| @@ -160,7 +157,7 @@ int Convolution::create_pipeline(const Option& opt) | |||
| dequantize_ops[n]->load_param(pd); | |||
| dequantize_ops[n]->create_pipeline(opt_cpu); | |||
| dequantize_ops[n]->create_pipeline(opt); | |||
| ncnn::Mat weights[1]; | |||
| weights[0] = bias_data.range(n, 1); | |||
| @@ -176,26 +173,23 @@ int Convolution::create_pipeline(const Option& opt) | |||
| int Convolution::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (quantize) | |||
| { | |||
| quantize->destroy_pipeline(opt_cpu); | |||
| quantize->destroy_pipeline(opt); | |||
| delete quantize; | |||
| quantize = 0; | |||
| } | |||
| for (int i=0; i<(int)dequantize_ops.size(); i++) | |||
| { | |||
| dequantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| dequantize_ops[i]->destroy_pipeline(opt); | |||
| delete dequantize_ops[i]; | |||
| } | |||
| dequantize_ops.clear(); | |||
| for (int i=0; i<(int)requantize_ops.size(); i++) | |||
| { | |||
| requantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| requantize_ops[i]->destroy_pipeline(opt); | |||
| delete requantize_ops[i]; | |||
| } | |||
| requantize_ops.clear(); | |||
| @@ -289,9 +283,7 @@ int Convolution::forward(const Mat& bottom_blob, Mat& top_blob, const Option& op | |||
| op->load_model(ModelBinFromMatArray(weights)); | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| // forward | |||
| op->forward(bottom_blob, top_blob, opt); | |||
| @@ -100,9 +100,6 @@ int ConvolutionDepthWise::load_model(const ModelBin& mb) | |||
| int ConvolutionDepthWise::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| use_int8_inference = opt.use_int8_inference; | |||
| if (int8_scale_term == 0) | |||
| @@ -135,7 +132,7 @@ int ConvolutionDepthWise::create_pipeline(const Option& opt) | |||
| op->load_param(pd); | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| ncnn::Option opt; | |||
| opt.blob_allocator = int8_weight_data.allocator; | |||
| @@ -164,7 +161,7 @@ int ConvolutionDepthWise::create_pipeline(const Option& opt) | |||
| quantize_ops[g]->load_param(pd); | |||
| quantize_ops[g]->create_pipeline(opt_cpu); | |||
| quantize_ops[g]->create_pipeline(opt); | |||
| } | |||
| for (int g=0; g<group; g++) | |||
| @@ -189,7 +186,7 @@ int ConvolutionDepthWise::create_pipeline(const Option& opt) | |||
| dequantize_ops[g]->load_model(ModelBinFromMatArray(weights)); | |||
| dequantize_ops[g]->create_pipeline(opt_cpu); | |||
| dequantize_ops[g]->create_pipeline(opt); | |||
| dequantize_scales.push_back(top_rescale); | |||
| } | |||
| @@ -200,26 +197,23 @@ int ConvolutionDepthWise::create_pipeline(const Option& opt) | |||
| int ConvolutionDepthWise::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| for (int i=0; i<(int)quantize_ops.size(); i++) | |||
| { | |||
| quantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| quantize_ops[i]->destroy_pipeline(opt); | |||
| delete quantize_ops[i]; | |||
| } | |||
| quantize_ops.clear(); | |||
| for (int i=0; i<(int)dequantize_ops.size(); i++) | |||
| { | |||
| dequantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| dequantize_ops[i]->destroy_pipeline(opt); | |||
| delete dequantize_ops[i]; | |||
| } | |||
| dequantize_ops.clear(); | |||
| for (int i=0; i<(int)requantize_ops.size(); i++) | |||
| { | |||
| requantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| requantize_ops[i]->destroy_pipeline(opt); | |||
| delete requantize_ops[i]; | |||
| } | |||
| requantize_ops.clear(); | |||
| @@ -64,9 +64,6 @@ int InnerProduct::load_model(const ModelBin& mb) | |||
| int InnerProduct::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| use_int8_inference = opt.use_int8_inference; | |||
| if (int8_scale_term == 0) | |||
| @@ -91,7 +88,7 @@ int InnerProduct::create_pipeline(const Option& opt) | |||
| quantize->load_param(pd); | |||
| quantize->create_pipeline(opt_cpu); | |||
| quantize->create_pipeline(opt); | |||
| } | |||
| dequantize_ops.resize(num_output); | |||
| @@ -118,7 +115,7 @@ int InnerProduct::create_pipeline(const Option& opt) | |||
| dequantize_ops[n]->load_model(ModelBinFromMatArray(weights)); | |||
| dequantize_ops[n]->create_pipeline(opt_cpu); | |||
| dequantize_ops[n]->create_pipeline(opt); | |||
| } | |||
| } | |||
| @@ -141,7 +138,7 @@ int InnerProduct::create_pipeline(const Option& opt) | |||
| op->load_param(pd); | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| ncnn::Option opt; | |||
| opt.blob_allocator = int8_weight_data.allocator; | |||
| @@ -161,19 +158,16 @@ int InnerProduct::create_pipeline(const Option& opt) | |||
| int InnerProduct::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (quantize) | |||
| { | |||
| quantize->destroy_pipeline(opt_cpu); | |||
| quantize->destroy_pipeline(opt); | |||
| delete quantize; | |||
| quantize = 0; | |||
| } | |||
| for (int i=0; i<(int)dequantize_ops.size(); i++) | |||
| { | |||
| dequantize_ops[i]->destroy_pipeline(opt_cpu); | |||
| dequantize_ops[i]->destroy_pipeline(opt); | |||
| delete dequantize_ops[i]; | |||
| } | |||
| dequantize_ops.clear(); | |||
| @@ -47,9 +47,6 @@ Convolution_x86::Convolution_x86() | |||
| int Convolution_x86::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation_type == 1) | |||
| { | |||
| activation = ncnn::create_layer(ncnn::LayerType::ReLU); | |||
| @@ -84,7 +81,7 @@ int Convolution_x86::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| use_winograd3x3 = false; | |||
| @@ -122,12 +119,9 @@ int Convolution_x86::create_pipeline(const Option& opt) | |||
| int Convolution_x86::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation) | |||
| { | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| @@ -35,9 +35,6 @@ ConvolutionDepthWise_x86::ConvolutionDepthWise_x86() | |||
| int ConvolutionDepthWise_x86::create_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation_type == 1) | |||
| { | |||
| activation = ncnn::create_layer(ncnn::LayerType::ReLU); | |||
| @@ -72,7 +69,7 @@ int ConvolutionDepthWise_x86::create_pipeline(const Option& opt) | |||
| if (activation) | |||
| { | |||
| activation->create_pipeline(opt_cpu); | |||
| activation->create_pipeline(opt); | |||
| } | |||
| // create Convolution op for each group | |||
| @@ -156,7 +153,7 @@ int ConvolutionDepthWise_x86::create_pipeline(const Option& opt) | |||
| op->load_model(ModelBinFromMatArray(weights)); | |||
| } | |||
| op->create_pipeline(opt_cpu); | |||
| op->create_pipeline(opt); | |||
| group_ops[g] = op; | |||
| } | |||
| @@ -166,19 +163,16 @@ int ConvolutionDepthWise_x86::create_pipeline(const Option& opt) | |||
| int ConvolutionDepthWise_x86::destroy_pipeline(const Option& opt) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| if (activation) | |||
| { | |||
| activation->destroy_pipeline(opt_cpu); | |||
| activation->destroy_pipeline(opt); | |||
| delete activation; | |||
| activation = 0; | |||
| } | |||
| for (int i=0; i<(int)group_ops.size(); i++) | |||
| { | |||
| group_ops[i]->destroy_pipeline(opt_cpu); | |||
| group_ops[i]->destroy_pipeline(opt); | |||
| delete group_ops[i]; | |||
| } | |||
| group_ops.clear(); | |||
| @@ -48,9 +48,7 @@ int YoloDetectionOutput::create_pipeline(const Option& opt) | |||
| softmax->load_param(pd); | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| softmax->create_pipeline(opt_cpu); | |||
| softmax->create_pipeline(opt); | |||
| } | |||
| return 0; | |||
| @@ -60,9 +58,7 @@ int YoloDetectionOutput::destroy_pipeline(const Option& opt) | |||
| { | |||
| if (softmax) | |||
| { | |||
| Option opt_cpu = opt; | |||
| opt_cpu.use_vulkan_compute = false; | |||
| softmax->destroy_pipeline(opt_cpu); | |||
| softmax->destroy_pipeline(opt); | |||
| delete softmax; | |||
| softmax = 0; | |||
| } | |||