From a334513b5ea9cf2e11d2cf13f34ac69342d97929 Mon Sep 17 00:00:00 2001 From: nihuini Date: Tue, 8 Sep 2020 20:02:57 +0800 Subject: [PATCH] fp16a option fix --- src/gpu.cpp | 2 ++ src/net.cpp | 20 ++++++++++++++++++-- tests/test_squeezenet.cpp | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/gpu.cpp b/src/gpu.cpp index 64c1588a4..0101d1878 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -2372,6 +2372,8 @@ void VulkanDevice::destroy_utility_operator() { Option opt; opt.use_vulkan_compute = true; + opt.use_fp16_arithmetic = false; + opt.use_int8_arithmetic = false; opt.pipeline_cache = 0; // from buffer | image diff --git a/src/net.cpp b/src/net.cpp index 26a775939..901785100 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -166,6 +166,14 @@ int Net::load_param(const DataReader& dr) if (vkdev->info.bug_storage_buffer_no_l1) opt.use_image_storage = true; if (vkdev->info.bug_layout_binding_id_alias) opt.use_image_storage = false; + + // fp16a makes no sense when fp16 storage disabled + if (!opt.use_fp16_packed && !opt.use_fp16_storage) opt.use_fp16_arithmetic = false; + } + else + { + // fp16a makes no sense when fp16 storage disabled + if (!opt.use_fp16_storage) opt.use_fp16_arithmetic = false; } #endif // NCNN_VULKAN @@ -374,6 +382,14 @@ int Net::load_param_bin(const DataReader& dr) if (vkdev->info.bug_storage_buffer_no_l1) opt.use_image_storage = true; if (vkdev->info.bug_layout_binding_id_alias) opt.use_image_storage = false; + + // fp16a makes no sense when fp16 storage disabled + if (!opt.use_fp16_packed && !opt.use_fp16_storage) opt.use_fp16_arithmetic = false; + } + else + { + // fp16a makes no sense when fp16 storage disabled + if (!opt.use_fp16_storage) opt.use_fp16_arithmetic = false; } #endif // NCNN_VULKAN @@ -1183,7 +1199,7 @@ int Net::forward_layer(int layer_index, std::vector& blob_mats, const Optio if (elemcount % 8 == 0) dst_elempack = 8; #elif NCNN_ARM82 - if (elemcount % 8 == 0 && opt.use_fp16_arithmetic && layer->support_fp16_storage) + if (elemcount % 8 == 0 && opt.use_fp16_storage && opt.use_fp16_arithmetic && layer->support_fp16_storage) dst_elempack = 8; else if (elemcount % 4 == 0) dst_elempack = 4; @@ -1316,7 +1332,7 @@ int Net::forward_layer(int layer_index, std::vector& blob_mats, const Optio if (elemcount % 8 == 0) dst_elempack = 8; #elif NCNN_ARM82 - if (elemcount % 8 == 0 && opt.use_fp16_arithmetic && layer->support_fp16_storage) + if (elemcount % 8 == 0 && opt.use_fp16_storage && opt.use_fp16_arithmetic && layer->support_fp16_storage) dst_elempack = 8; else if (elemcount % 4 == 0) dst_elempack = 4; diff --git a/tests/test_squeezenet.cpp b/tests/test_squeezenet.cpp index 2d7249137..e27de9a66 100644 --- a/tests/test_squeezenet.cpp +++ b/tests/test_squeezenet.cpp @@ -219,18 +219,21 @@ int main() opts[0].use_packing_layout = false; opts[0].use_fp16_packed = false; opts[0].use_fp16_storage = false; + opts[0].use_fp16_arithmetic = false; opts[0].use_shader_pack8 = false; opts[0].use_image_storage = false; opts[1].use_packing_layout = true; opts[1].use_fp16_packed = true; opts[1].use_fp16_storage = false; + opts[1].use_fp16_arithmetic = false; opts[1].use_shader_pack8 = true; opts[1].use_image_storage = false; opts[2].use_packing_layout = true; opts[2].use_fp16_packed = true; opts[2].use_fp16_storage = true; + opts[2].use_fp16_arithmetic = false; opts[2].use_bf16_storage = true; opts[2].use_shader_pack8 = true; opts[2].use_image_storage = true; @@ -240,6 +243,7 @@ int main() opts[3].use_packing_layout = true; opts[3].use_fp16_packed = true; opts[3].use_fp16_storage = true; + opts[3].use_fp16_arithmetic = false;// FIXME enable me opts[3].use_bf16_storage = false; opts[3].use_shader_pack8 = true; opts[3].use_image_storage = true;