From 2be7b13d84dc637bb64d2aa71de633b7bc09a7ba Mon Sep 17 00:00:00 2001 From: daquexian Date: Tue, 28 May 2019 17:24:51 +0800 Subject: [PATCH 01/24] Update README --- README.md | 4 ++-- README_CN.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ab627b..cf99a1a 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ The following is the comparison between our dabnn and [Caffe](http://caffe.berke ## Convert ONNX Model -We provide a conversion tool, named onnx2bnn, to convert an ONNX model to a dabnn model. To get the conversion tool, just build the project using the native toolchain (instead of arm cross-compiling toolchain). For Linux users, we provide pre-built onnx2bnn AppImage. Linux users can download it from [GitHub Releases](https://github.com/JDAI-CV/dabnn/releases). For the usage and other information about AppImage, please check out https://appimage.org . +We provide a conversion tool, named onnx2bnn, to convert an ONNX model to a dabnn model. We provide onnx2bnn pre-built binaries for all platforms in [GitHub Releases](https://github.com/JDAI-CV/dabnn/releases). For Linux users, the onnx2bnn pre-built binary is [AppImage](https://appimage.org) format, see https://appimage.org for details. -Note: Binary convolution is a custom operator, so whether the ONNX model is dabnn-comptabile heavily depends on the implementation of the binary convolution in the training code. We will soon provide an dabnn-comptabile PyTorch implementation of binary convolution. +Note: Binary convolution is a custom operator, so whether the ONNX model is dabnn-comptabile heavily depends on the implementation of the binary convolution in the training code. Please check out [our wiki](https://github.com/JDAI-CV/dabnn/wiki/Train,-export-and-convert-a-dabnn-model) for the further information. After conversion, the generated dabnn model can be deployed on armv8 devices. For Android developer, we have provided Android AAR package and published it on [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion), for the usage please check out [example project](https://github.com/JDAI-CV/dabnn-example). diff --git a/README_CN.md b/README_CN.md index 0d7a4ef..b93dca6 100644 --- a/README_CN.md +++ b/README_CN.md @@ -48,9 +48,9 @@ dabnn_bireal18_imagenet_stem 43279353 ns 41533009 ns 14 <--- ## 如何转换 ONNX 模型 -我们提供模型转换工具 onnx2bnn 将 ONNX 模型转换为 dabnn 格式的模型。用本地编译工具链(而不是 arm 交叉编译工具链)编译这个项目就可以编译出 onnx2dnn。对 Linux 用户我们提供可以在 Linux 下无需编译直接运行的 AppImage,从 [GitHub Releases](https://github.com/JDAI-CV/dabnn/releases) 下载即可。AppImage 的使用方法和其它相关信息请参考 https://appimage.org/。 +我们提供模型转换工具 onnx2bnn 将 ONNX 模型转换为 dabnn 格式的模型。在 [GitHub Releases](https://github.com/JDAI-CV/dabnn/releases) 里有各个平台的 onnx2bnn 预编译二进制文件,可以直接下载运行。Linux 用户我们提供的是 AppImage 格式的二进制文件,AppImage 的使用方法和其它相关信息请参考 https://appimage.org/。 -注意:因为二值卷积是一种自定义操作,所以 ONNX 模型是否与 dabnn 兼容极大程度上依赖于训练代码中二值卷积的实现。我们很快会提供一个与 dabnn 兼容的二值卷积 PyTorch 实现。 +注意:因为二值卷积是一种自定义操作,所以 ONNX 模型是否与 dabnn 兼容极大程度上依赖于训练代码中二值卷积的实现,在 [wiki](https://github.com/JDAI-CV/dabnn/wiki/Train,-export-and-convert-a-dabnn-model) 中有详细的进一步描述。 转换完成后得到的 dabnn 模型就可以在 armv8 设备上使用。对 Android 开发者我们已经把 Android AAR 包上传到了 [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion),使用方法请看[示例工程](https://github.com/JDAI-CV/dabnn-example)。 From 132ca100790e9824b1bd457ca668da99eedcacfc Mon Sep 17 00:00:00 2001 From: daquexian Date: Tue, 28 May 2019 19:45:47 +0800 Subject: [PATCH 02/24] Use ninja instead of make in net_test configuration --- .daq_pm/configs/net_test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.daq_pm/configs/net_test b/.daq_pm/configs/net_test index 6bf0eae..31da42e 100644 --- a/.daq_pm/configs/net_test +++ b/.daq_pm/configs/net_test @@ -3,5 +3,5 @@ name binary-nn type cpp build_dir build_net_test target net_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/net_test From c039558283d5f27fe2338c386cad91ba49e0ebfa Mon Sep 17 00:00:00 2001 From: daquexian Date: Tue, 28 May 2019 19:47:34 +0800 Subject: [PATCH 03/24] 1. Update CMakeLists.txt to support non-Android aarch64 devices 2. Add guard on optimized methods, and delegate to non-optimized methods on unsupported devices --- .daq_pm/configs/bconv_test_x86 | 7 +++++++ .daq_pm/configs/net_test_x86 | 7 +++++++ CMakeLists.txt | 15 +++++++++------ cmake/system.cmake | 3 ++- dabnn/bconv.h | 15 +++++++++++++++ dabnn/bgemm.h | 13 +++++++++++-- dabnn/bitpack.h | 6 ++++++ dabnn/layers/AvePool.cpp | 7 +++++++ dabnn/layers/BinConv.cpp | 8 ++++++++ dabnn/layers/MaxPool.cpp | 6 ++++++ dabnn/layers/Relu.cpp | 7 +++++++ dabnn/net.cpp | 4 ++++ tests/bconv_test.cpp | 4 ++-- 13 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 .daq_pm/configs/bconv_test_x86 create mode 100644 .daq_pm/configs/net_test_x86 diff --git a/.daq_pm/configs/bconv_test_x86 b/.daq_pm/configs/bconv_test_x86 new file mode 100644 index 0000000..f8c6d11 --- /dev/null +++ b/.daq_pm/configs/bconv_test_x86 @@ -0,0 +1,7 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_bconv_test_x86 +target bconv_test +cmake_options -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBNN_BUILD_MAIN_LIB=ON -GNinja +binary tests/bconv_test diff --git a/.daq_pm/configs/net_test_x86 b/.daq_pm/configs/net_test_x86 new file mode 100644 index 0000000..9d5268d --- /dev/null +++ b/.daq_pm/configs/net_test_x86 @@ -0,0 +1,7 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_net_test_x86 +target net_test +cmake_options -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -DBNN_BUILD_MAIN_LIB=ON -GNinja +binary tests/net_test diff --git a/CMakeLists.txt b/CMakeLists.txt index 9525b24..3644bb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,11 +22,15 @@ option(BNN_SYSTEM_PROTOBUF "Use system protobuf to build onnx2bnn" ON) option(BNN_BUILD_PYTHON "Build onnx2bnn python interface" OFF) option(BNN_USE_MSVC_STATIC_RUNTIME "Link onnx2bnn to msvc static runtime" ON) -if (${CMAKE_SYSTEM_NAME} STREQUAL "Android") - set(BNN_BUILD_ANDROID ON) -else() - set(BNN_BUILD_ANDROID OFF) +message(STATUS "Target architecture: ${CMAKE_SYSTEM_PROCESSOR}") +if (NOT DEFINED BNN_BUILD_MAIN_LIB) + if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + set(BNN_BUILD_MAIN_LIB ON) + else() + set(BNN_BUILD_MAIN_LIB OFF) + endif() endif() +message(STATUS "BNN_BUILD_MAIN_LIB: ${BNN_BUILD_MAIN_LIB}") include(cmake/utils.cmake) bnn_add_msvc_runtime_flag() @@ -42,7 +46,7 @@ if (${BNN_NET_BENCHMARK}) add_compile_options("-DBNN_BENCHMARK") endif() -if (${BNN_BUILD_ANDROID}) +if (BNN_BUILD_MAIN_LIB) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") @@ -64,7 +68,6 @@ if (${BNN_BUILD_ANDROID}) configure_benchmark() add_subdirectory(benchmark) endif() - else() set(CMAKE_CXX_STANDARD 11) diff --git a/cmake/system.cmake b/cmake/system.cmake index 2beb253..794c559 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -1,6 +1,7 @@ # Copyright 2019 JD.com Inc. JD AI -if (${CMAKE_SYSTEM_NAME} STREQUAL "Android") +if ((NOT CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME) OR + (NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR)) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/dabnn/bconv.h b/dabnn/bconv.h index 3dd43c0..fad4800 100644 --- a/dabnn/bconv.h +++ b/dabnn/bconv.h @@ -7,11 +7,15 @@ #include #endif // __ARM_NEON +#if not defined (__aarch64__) +#include +#endif #include #include #include "mat.h" namespace bnn { +#ifdef __aarch64__ inline void bconv_1x1_64(const Mat &bottom_blob, const Mat &weight, Mat &top_blob); inline void bconv_1x1_128(const Mat &bottom_blob, const Mat &weight, @@ -20,8 +24,10 @@ inline void bconv_1x1_256(const Mat &bottom_blob, const Mat &weight, Mat &top_blob); inline void bconv_1x1_512(const Mat &bottom_blob, const Mat &weight, Mat &top_blob); +#endif inline void bconv_3x3(const Mat &bottom_blob, const Mat &weight, Mat &top_blob, const int stride = 1); +#ifdef __aarch64__ inline void bconv_3x3_64(const Mat &bottom_blob, const Mat &weight, Mat &top_blob, const int stride = 1); inline void bconv_3x3_64_fallback(const Mat &bottom_blob, const Mat &weight, @@ -44,8 +50,10 @@ inline void bconv_3x3_128_internal_s1(const uint64_t *bottom_ptr, const int b_w, inline void bconv_3x3_128_internal_fallback( const uint64_t *bottom_ptr, const int b_w, const uint64_t *weight_ptr, float *top_ptr, const int top_h, const int top_w, const int stride = 1); +#endif } // namespace bnn +#ifdef __aarch64__ inline void bnn::bconv_3x3_64(const Mat &bottom_blob, const Mat &weight, Mat &top_blob, const int stride) { bconv_3x3_64_opt4(bottom_blob, weight, top_blob, 0, stride); @@ -819,9 +827,11 @@ inline void unpack_output(float *b, float *a, int width, int height, #undef A } +#endif // __aarch64__ inline void bnn::bconv_3x3(const Mat &bottom_blob, const Mat &weight, Mat &top_blob, const int stride) { +#ifdef __aarch64__ // TODO: more elegant way static uint64_t packed_weight[999999]; static uint64_t packed_input[9999999]; @@ -884,8 +894,12 @@ inline void bnn::bconv_3x3(const Mat &bottom_blob, const Mat &weight, unpack_output(packed_output, static_cast(top_blob.data), top_blob.w, top_blob.h, top_blob.c); } +#else // __aarch64__ + baseline_bconv(bottom_blob, weight, 3, 3, 0, 0, stride, stride, 1, 1, top_blob.c, top_blob); +#endif // __aarch64__ } +#ifdef __aarch64__ inline void bnn::bconv_1x1_512(const Mat &bottom_blob, const Mat &weight, Mat &top_blob) { FORZS(th, top_blob.h, 2) { @@ -1673,5 +1687,6 @@ inline void bnn::bconv_1x1_64(const Mat &bottom_blob, const Mat &weight, } } } +#endif // __aarch64__ #endif diff --git a/dabnn/bgemm.h b/dabnn/bgemm.h index dc530b0..affb15e 100644 --- a/dabnn/bgemm.h +++ b/dabnn/bgemm.h @@ -16,6 +16,7 @@ #define min(i, j) ((i) < (j) ? (i) : (j)) +#if __aarch64__ inline void pack_a(const int kc, const uint64_t *a, const int lda, uint64_t *a_to); inline void pack_b(const int kc, const uint64_t *b, const int ldb, @@ -28,6 +29,7 @@ inline void inner_kernel(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc, const int first_time); +#endif // __aarch64__ inline void bgemm_naive(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc); @@ -35,6 +37,7 @@ inline void bgemm_naive(const int m, const int n, const int k, inline void bgemm(const int m, const int n, const int k, const uint64_t *a, int lda, const uint64_t *b, const int ldb, float *c, const int ldc) { +#if __aarch64__ int kc = 32; int mc = 32; int i, q, qb, ib; @@ -48,8 +51,12 @@ inline void bgemm(const int m, const int n, const int k, const uint64_t *a, i == 0); } } +#else + bgemm_naive(m, n, k, a, lda, b, ldb, c, ldc); +#endif // __aarch64__ } +#if __aarch64__ inline void inner_kernel(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc, @@ -414,9 +421,11 @@ inline void micro_kernel(int64_t kc, float *c, const uint64_t *a, "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"); } +#endif // __aarch64__ -inline void bgemm_naive(int m, int n, int k, uint64_t *a, int lda, uint64_t *b, - int ldb, float *c, int ldc) { +inline void bgemm_naive(const int m, const int n, const int k, + const uint64_t *a, const int lda, const uint64_t *b, + const int ldb, float *c, const int ldc) { FORZ(i, m) { FORZ(j, n) { FORZ(h, k) { diff --git a/dabnn/bitpack.h b/dabnn/bitpack.h index 8be37da..b90532c 100644 --- a/dabnn/bitpack.h +++ b/dabnn/bitpack.h @@ -16,6 +16,7 @@ #include #include "mat.h" +#ifdef __aarch64__ inline void pack_128_2(const float *float_ptr, void *binary_ptr, size_t size) { size_t nn_size = size >> 7; @@ -198,6 +199,7 @@ inline void pack_mat_128(const bnn::Mat &float_mat, bnn::Mat &binary_mat) { pack_128(static_cast(float_mat.data), binary_mat.data, float_mat.total()); } +#endif // __aarch64__ inline void pack_mat_64(const bnn::Mat &float_mat, bnn::Mat &binary_mat) { BNN_ASSERT( @@ -220,11 +222,15 @@ inline void pack_mat_64(const bnn::Mat &float_mat, bnn::Mat &binary_mat) { inline void pack_mat(const bnn::Mat &float_mat, bnn::Mat &binary_mat) { BNN_ASSERT(float_mat.c % 64 == 0, float_mat.c); +#ifdef __aarch64__ if (float_mat.c % 128 == 0) { pack_mat_128_2(float_mat, binary_mat); } else { pack_mat_64(float_mat, binary_mat); } +#else + pack_mat_64(float_mat, binary_mat); +#endif // __aarch64__ } #endif /* BITPACK_H */ diff --git a/dabnn/layers/AvePool.cpp b/dabnn/layers/AvePool.cpp index 3ef86a3..6d1395b 100644 --- a/dabnn/layers/AvePool.cpp +++ b/dabnn/layers/AvePool.cpp @@ -7,6 +7,7 @@ namespace bnn { +#ifdef __aarch64__ void ave_pool_2x2_s2(const bnn::Mat &input, bnn::Mat &output) { FORZ(h, output.h) { FORZ(w, output.w) { @@ -48,6 +49,7 @@ void ave_pool_2x2_s2(const bnn::Mat &input, bnn::Mat &output) { } } } +#endif // __aarch64__ void ave_pool_fallback(const bnn::Mat &input, const size_t pad_h, const size_t pad_w, const size_t stride_h, @@ -114,6 +116,7 @@ AvePool::AvePool(NetCP net, const std::string &name, css input, css output, } void AvePool::forward_impl() const { +#ifdef __aarch64__ if (stride_h == 2 && stride_w == 2 && kernel_h == 2 && kernel_w == 2 && input_mat->c % 4 == 0) { pad(*input_mat, pad_h, pad_w, *padded_mat); @@ -122,6 +125,10 @@ void AvePool::forward_impl() const { ave_pool_fallback(*input_mat, pad_h, pad_w, stride_h, stride_w, kernel_h, kernel_w, *output_mat); } +#else + ave_pool_fallback(*input_mat, pad_h, pad_w, stride_h, stride_w, + kernel_h, kernel_w, *output_mat); +#endif // __aarch64__ } } // namespace bnn diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index 79cdd8f..2c7b599 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -57,6 +57,7 @@ BinConv::BinConv(NetCP net, const std::string &name, css input, css weight, } bool BinConv::direct_conv_compatible() const { +#ifdef __aarch64__ if (weight_mat->h == 3 && weight_mat->w == 3 && input_mat->c == 1 && stride_h == stride_w) { return true; @@ -78,10 +79,17 @@ bool BinConv::direct_conv_compatible() const { return true; } return false; +#else + return false; +#endif } bool BinConv::gemm_compatible() const { +#ifdef __aarch64__ return weight_mat->h * weight_mat->n * weight_mat->c % 2 == 0; +#else + return false; +#endif } void BinConv::forward_impl() const { diff --git a/dabnn/layers/MaxPool.cpp b/dabnn/layers/MaxPool.cpp index fe2080d..7fd965a 100644 --- a/dabnn/layers/MaxPool.cpp +++ b/dabnn/layers/MaxPool.cpp @@ -9,6 +9,7 @@ namespace bnn { +#ifdef __aarch64__ void maxpool2x2(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, const int stride_w = 1) { FORZ(h, output.h) { @@ -126,6 +127,7 @@ void maxpool3x3(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, } } } +#endif // __aarch64__ MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, int kernel_h, int kernel_w, int pad_h, int pad_w, int stride_h, @@ -150,6 +152,7 @@ MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, padded_mat = mat_map[pad_name]; } void MaxPool::forward_impl() const { +#ifdef __aarch64__ // std::numeric_limits::min() is the closest value to 0, so we uses // -max() pad(*input_mat, pad_h, pad_w, *padded_mat, @@ -164,6 +167,9 @@ void MaxPool::forward_impl() const { } else { std::invalid_argument("Not supported max_pool"); } +#else + std::invalid_argument("Not supported max_pool"); +#endif // __aarch64__ } std::string MaxPool::to_str() const { diff --git a/dabnn/layers/Relu.cpp b/dabnn/layers/Relu.cpp index 37f0061..51ead33 100644 --- a/dabnn/layers/Relu.cpp +++ b/dabnn/layers/Relu.cpp @@ -8,6 +8,7 @@ namespace bnn { void Relu::forward_impl() const { +#if __ARM_NEON float32x4_t _zero = vdupq_n_f32(0.f); float *ptr = static_cast(*data_mat); FORZ(i, data_mat->total() / 4) { @@ -17,5 +18,11 @@ void Relu::forward_impl() const { ptr += 4; } +#else + float *ptr = static_cast(*data_mat); + FORZ(i, data_mat->total()) { + *ptr = std::max(*ptr, 0.f); + } +#endif // __ARM_NEON } } // namespace bnn diff --git a/dabnn/net.cpp b/dabnn/net.cpp index b2c4870..fcdb3a8 100644 --- a/dabnn/net.cpp +++ b/dabnn/net.cpp @@ -78,6 +78,7 @@ void Net::prepare() { shaper.AddShape(name, shape); +#ifdef __aarch64__ if (Shaper::c(shape) % 128 == 0) { // Re-arrange the bit order const auto len = shaper.total(shape); @@ -95,11 +96,14 @@ void Net::prepare() { bnn::DataType::Bit, false)); pack_mat_128_2(*tmp, *mat_map_[name]); } else { +#endif // __aarch64__ add_mat(name, std::make_shared( shape[0], shape[1], shape[2], shape[3], const_cast(data), bnn::DataType::Bit, false)); +#ifdef __aarch64__ } +#endif // __aarch64__ } else if (tensor->data_type() == flatbnn::DataType::Float32) { Shaper::Shape shape(tensor->shape()->begin(), tensor->shape()->end()); diff --git a/tests/bconv_test.cpp b/tests/bconv_test.cpp index d6e2bfe..b719255 100644 --- a/tests/bconv_test.cpp +++ b/tests/bconv_test.cpp @@ -190,7 +190,7 @@ TEST(bconv_test, bconv_test_3x3_64) { bnn::Mat c(CHEIGHT, CWIDTH, NUM_OUTPUT, bnn::DataType::Float); c.fill(0); - bnn::bconv_3x3_64(padded, b, c); + bnn::bconv_3x3(padded, b, c); bnn::Mat expected(CHEIGHT, CWIDTH, NUM_OUTPUT, bnn::DataType::Float); expected.fill(0); @@ -229,7 +229,7 @@ TEST(bconv_test, bconv_test_3x3_64_s2) { bnn::Mat c(CHEIGHT, CWIDTH, NUM_OUTPUT, bnn::DataType::Float); c.fill(0); - bnn::bconv_3x3_64(padded, b, c, 2); + bnn::bconv_3x3(padded, b, c, 2); bnn::Mat expected(CHEIGHT, CWIDTH, NUM_OUTPUT, bnn::DataType::Float); expected.fill(0); From 275a8555778f1ebd9c7f6249544c2d1a92f36295 Mon Sep 17 00:00:00 2001 From: daquexian Date: Tue, 28 May 2019 23:55:59 +0800 Subject: [PATCH 04/24] Remove unnecessary logs --- dabnn/mat.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/dabnn/mat.h b/dabnn/mat.h index c12fe80..d500212 100644 --- a/dabnn/mat.h +++ b/dabnn/mat.h @@ -273,8 +273,6 @@ inline bool Mat::operator==(const Mat &m) const { } FORZ(i, total()) { if (std::abs(static_cast(data)[i] - m[i]) > 1e-5) { - PNT(static_cast(data)[i]); - PNT(m[i]); return false; } } From b47929ab942778f270acde1134360661a6b3cdaa Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 00:22:35 +0800 Subject: [PATCH 05/24] Replace __builtin_popcountl in armv7, since long is 32-bit here --- .daq_pm/configs/bgemm_test_v7 | 7 +++++++ .daq_pm/configs/bgemm_test_x86 | 7 +++++++ common/baseline.h | 4 ++++ dabnn/bgemm.h | 9 +++++---- tests/bitpack_test.cpp | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 .daq_pm/configs/bgemm_test_v7 create mode 100644 .daq_pm/configs/bgemm_test_x86 diff --git a/.daq_pm/configs/bgemm_test_v7 b/.daq_pm/configs/bgemm_test_v7 new file mode 100644 index 0000000..15cca2c --- /dev/null +++ b/.daq_pm/configs/bgemm_test_v7 @@ -0,0 +1,7 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_test_v7 +target bgemm_test +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +binary ~/adb_push_and_run.sh tests/bgemm_test diff --git a/.daq_pm/configs/bgemm_test_x86 b/.daq_pm/configs/bgemm_test_x86 new file mode 100644 index 0000000..1ad0276 --- /dev/null +++ b/.daq_pm/configs/bgemm_test_x86 @@ -0,0 +1,7 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_test_x86 +target bgemm_test +cmake_options -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBNN_BUILD_MAIN_LIB=ON -GNinja +binary tests/bgemm_test diff --git a/common/baseline.h b/common/baseline.h index 397d3e1..9888089 100644 --- a/common/baseline.h +++ b/common/baseline.h @@ -10,8 +10,12 @@ #include inline int bitcount(uint64_t x) { +#ifdef __aarch64__ + return __builtin_popcountl(x); +#else std::bitset<64> bs(x); return bs.count(); +#endif } inline void baseline_pack_mat(const bnn::Mat &float_mat, bnn::Mat &binary_mat) { diff --git a/dabnn/bgemm.h b/dabnn/bgemm.h index affb15e..b17efe3 100644 --- a/dabnn/bgemm.h +++ b/dabnn/bgemm.h @@ -6,6 +6,7 @@ #if __ARM_NEON #include #endif // __ARM_NEON +#include #include #define P 8 @@ -86,7 +87,7 @@ inline void inner_kernel(const int m, const int n, const int k, FOR(_j, 0, j) { FOR(_i, i, m) { FORZ(_k, k) { - C(_i, _j) += __builtin_popcountl(A(_i, _k) ^ B(_k, _j)); + C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } @@ -95,7 +96,7 @@ inline void inner_kernel(const int m, const int n, const int k, FOR(_j, j, n) { FOR(_i, 0, i) { FORZ(_k, k) { - C(_i, _j) += __builtin_popcountl(A(_i, _k) ^ B(_k, _j)); + C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } @@ -104,7 +105,7 @@ inline void inner_kernel(const int m, const int n, const int k, FOR(_j, j, n) { FOR(_i, i, m) { FORZ(_k, k) { - C(_i, _j) += __builtin_popcountl(A(_i, _k) ^ B(_k, _j)); + C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } @@ -430,7 +431,7 @@ inline void bgemm_naive(const int m, const int n, const int k, FORZ(j, n) { FORZ(h, k) { C(i, j) += static_cast( - __builtin_popcountl((A(i, h) ^ B(h, j)))); + bitcount((A(i, h) ^ B(h, j)))); } } } diff --git a/tests/bitpack_test.cpp b/tests/bitpack_test.cpp index 31e8cfc..67d3645 100644 --- a/tests/bitpack_test.cpp +++ b/tests/bitpack_test.cpp @@ -74,3 +74,17 @@ TEST(bitpack, pack_mat_fallback) { ASSERT_EQ(a_binary, expected); } + +TEST(bitpack, addv_v7) { + uint64_t data[2]; + fill_rand_uint64(data, 2); + uint8x16_t v = vld1q_u8(reinterpret_cast(data)); + auto v1 = vcntq_u8(v); + auto v2 = vpaddlq_u8(v1); + auto v3 = vpaddlq_u16(v2); + auto v4 = vpaddlq_u32(v3); + + auto res = vgetq_lane_u64(v4, 0) + vgetq_lane_u64(v4, 1); + + ASSERT_EQ(res, __builtin_popcountl(data[0]) + __builtin_popcountl(data[1])); +} From 71fccacd096c80e822f88a4e92be932f0149509e Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 02:14:05 +0800 Subject: [PATCH 06/24] Update some configurations --- .daq_pm/configs/bconv_test_x86 | 2 +- .daq_pm/configs/bgemm_test | 4 ++-- .daq_pm/configs/bitpack_test | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.daq_pm/configs/bconv_test_x86 b/.daq_pm/configs/bconv_test_x86 index f8c6d11..360a39b 100644 --- a/.daq_pm/configs/bconv_test_x86 +++ b/.daq_pm/configs/bconv_test_x86 @@ -1,7 +1,7 @@ # It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) name binary-nn type cpp -build_dir build_bconv_test_x86 +build_dir build_test_x86 target bconv_test cmake_options -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBNN_BUILD_MAIN_LIB=ON -GNinja binary tests/bconv_test diff --git a/.daq_pm/configs/bgemm_test b/.daq_pm/configs/bgemm_test index 73e84b4..c049daa 100644 --- a/.daq_pm/configs/bgemm_test +++ b/.daq_pm/configs/bgemm_test @@ -1,7 +1,7 @@ # It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) name binary-nn type cpp -build_dir build_bgemm_test +build_dir build_test target bgemm_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/bgemm_test diff --git a/.daq_pm/configs/bitpack_test b/.daq_pm/configs/bitpack_test index f4a4b43..5515f0b 100644 --- a/.daq_pm/configs/bitpack_test +++ b/.daq_pm/configs/bitpack_test @@ -1,7 +1,7 @@ # It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) name binary-nn type cpp -build_dir build +build_dir build_test target bitpack_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/bitpack_test From 670b2eca1283053bc2d3a18c32b7dcf358046411 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 02:14:40 +0800 Subject: [PATCH 07/24] Add armv7 implementation of bgemm, however, a armv7 device is needed to test it --- CMakeLists.txt | 3 +- dabnn/bgemm.h | 471 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 453 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3644bb0..a7558d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,8 @@ option(BNN_USE_MSVC_STATIC_RUNTIME "Link onnx2bnn to msvc static runtime" ON) message(STATUS "Target architecture: ${CMAKE_SYSTEM_PROCESSOR}") if (NOT DEFINED BNN_BUILD_MAIN_LIB) - if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + if (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a") set(BNN_BUILD_MAIN_LIB ON) else() set(BNN_BUILD_MAIN_LIB OFF) diff --git a/dabnn/bgemm.h b/dabnn/bgemm.h index b17efe3..a02ff60 100644 --- a/dabnn/bgemm.h +++ b/dabnn/bgemm.h @@ -9,15 +9,23 @@ #include #include +#if __ARM_NEON +#ifdef __aarch64__ #define P 8 #define R 6 +#else +#define P 4 +#define R 4 +#endif // __aarch64__ +#endif // __ARM_NEON + #define A(i, j) a[(j)*lda + (i)] // A(y, x) #define B(i, j) b[(j)*ldb + (i)] // B(y, x) #define C(i, j) c[(j)*ldc + (i)] // C(y, x) #define min(i, j) ((i) < (j) ? (i) : (j)) -#if __aarch64__ +#ifdef __ARM_NEON inline void pack_a(const int kc, const uint64_t *a, const int lda, uint64_t *a_to); inline void pack_b(const int kc, const uint64_t *b, const int ldb, @@ -30,7 +38,7 @@ inline void inner_kernel(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc, const int first_time); -#endif // __aarch64__ +#endif // __ARM_NEON inline void bgemm_naive(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc); @@ -38,7 +46,7 @@ inline void bgemm_naive(const int m, const int n, const int k, inline void bgemm(const int m, const int n, const int k, const uint64_t *a, int lda, const uint64_t *b, const int ldb, float *c, const int ldc) { -#if __aarch64__ +#ifdef __ARM_NEON int kc = 32; int mc = 32; int i, q, qb, ib; @@ -54,10 +62,10 @@ inline void bgemm(const int m, const int n, const int k, const uint64_t *a, } #else bgemm_naive(m, n, k, a, lda, b, ldb, c, ldc); -#endif // __aarch64__ +#endif // __ARM_NEON } -#if __aarch64__ +#if __ARM_NEON inline void inner_kernel(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc, @@ -86,27 +94,21 @@ inline void inner_kernel(const int m, const int n, const int k, if (i != m) { FOR(_j, 0, j) { FOR(_i, i, m) { - FORZ(_k, k) { - C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); - } + FORZ(_k, k) { C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } } if (j != n) { FOR(_j, j, n) { FOR(_i, 0, i) { - FORZ(_k, k) { - C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); - } + FORZ(_k, k) { C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } } if (i != m || j != n) { FOR(_j, j, n) { FOR(_i, i, m) { - FORZ(_k, k) { - C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); - } + FORZ(_k, k) { C(_i, _j) += bitcount(A(_i, _k) ^ B(_k, _j)); } } } } @@ -143,11 +145,13 @@ inline void unpack_c(const float *c_from, const int ldc, float *c, inline void micro_kernel(int64_t kc, float *c, const uint64_t *a, const uint64_t *b) { +#ifdef __aarch64__ // C: 8x6(float 32, 6x2=12regs), A: 8*K(8regs), B: K*6(6regs) // v0~v11 contains C, v12~v17 contains 6*128 of B, v18~v25 contains 128*8 of - // A v26~v30 store temporary values A is packed as 8*128 - // ----- - // 8*128 + // A v26~v30 store temporary values A is packed as + // 8*128 + // ----- + // 8*128 // B is packed as 128*6 | 128*6 asm volatile( "mov x0, %1 \n" @@ -421,8 +425,436 @@ inline void micro_kernel(int64_t kc, float *c, const uint64_t *a, "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"); -} +#else // __aarch64__ + + // C: 4x4(float 32, 4x1=4), A: 4*K(4regs), B: K*4(4regs) + // q0~q3 contains C, q4~q7 contains 4*128 of B, q8~q11 contains 128*4 of A + // q12~q15 store temporary values + // + // A is packed as + // 4*128 + // ----- + // 4*128 + // B is packed as 128*4 | 128*4 + asm volatile( + "mov r0, %1 \n" + "vld1.8 {q0-q1}, [r0]! \n" + "vld1.8 {q2-q3}, [r0]! \n" + "0: \n" + "vld1.8 {q8-q9}, [%3]! \n" + "vld1.8 {q4-q5}, [%2]! \n" + "vld1.8 {q10-q11}, [%3]! \n" + "veor.u8 q12, q4, q8 \n" + "veor.u8 q13, q4, q9 \n" + "vcnt.u8 q12, q12 \n" + "vcnt.u8 q13, q13 \n" + "vld1.8 {q6-q7}, [%2]! \n" + "veor.u8 q14, q4, q10 \n" + "veor.u8 q15, q4, q11 \n" + "vcnt.u8 q14, q14 \n" + "vcnt.u8 q15, q15 \n" + "vpaddl.u8 q12, q12 \n" + "vpaddl.u8 q13, q13 \n" + "vpaddl.u8 q14, q14 \n" + "vpaddl.u8 q15, q15 \n" + "vpaddl.u16 q12, q12 \n" + "vpaddl.u16 q13, q13 \n" + "vpaddl.u16 q14, q14 \n" + "vpaddl.u16 q15, q15 \n" + "vpaddl.u32 q12, q12 \n" + "vpaddl.u32 q13, q13 \n" + "vpaddl.u32 q14, q14 \n" + "vpaddl.u32 q15, q15 \n" + "vadd.u32 d24, d24, d25 \n" + "vadd.u32 d26, d26, d27 \n" + "vadd.u32 d28, d28, d29 \n" + "vadd.u32 d30, d30, d31 \n" + "vzip.u32 q12, q14 \n" + "vzip.u32 q13, q15 \n" + "vzip.u32 q12, q13 \n" + "vadd.u32 q0, q0, q12 \n" + + "veor.u8 q12, q5, q8 \n" + "veor.u8 q13, q5, q9 \n" + "veor.u8 q14, q5, q10 \n" + "veor.u8 q15, q5, q11 \n" + "vcnt.u8 q12, q12 \n" + "vcnt.u8 q13, q13 \n" + "vcnt.u8 q14, q14 \n" + "vcnt.u8 q15, q15 \n" + "vpaddl.u8 q12, q12 \n" + "vpaddl.u8 q13, q13 \n" + "vpaddl.u8 q14, q14 \n" + "vpaddl.u8 q15, q15 \n" + "vpaddl.u16 q12, q12 \n" + "vpaddl.u16 q13, q13 \n" + "vpaddl.u16 q14, q14 \n" + "vpaddl.u16 q15, q15 \n" + "vpaddl.u32 q12, q12 \n" + "vpaddl.u32 q13, q13 \n" + "vpaddl.u32 q14, q14 \n" + "vpaddl.u32 q15, q15 \n" + "vadd.u32 d24, d24, d25 \n" + "vadd.u32 d26, d26, d27 \n" + "vadd.u32 d28, d28, d29 \n" + "vadd.u32 d30, d30, d31 \n" + "vzip.u32 q12, q14 \n" + "vzip.u32 q13, q15 \n" + "vzip.u32 q12, q13 \n" + "vadd.u32 q1, q1, q12 \n" + + "veor.u8 q12, q6, q8 \n" + "veor.u8 q13, q6, q9 \n" + "veor.u8 q14, q6, q10 \n" + "veor.u8 q15, q6, q11 \n" + "vcnt.u8 q12, q12 \n" + "vcnt.u8 q13, q13 \n" + "vcnt.u8 q14, q14 \n" + "vcnt.u8 q15, q15 \n" + "vpaddl.u8 q12, q12 \n" + "vpaddl.u8 q13, q13 \n" + "vpaddl.u8 q14, q14 \n" + "vpaddl.u8 q15, q15 \n" + "vpaddl.u16 q12, q12 \n" + "vpaddl.u16 q13, q13 \n" + "vpaddl.u16 q14, q14 \n" + "vpaddl.u16 q15, q15 \n" + "vpaddl.u32 q12, q12 \n" + "vpaddl.u32 q13, q13 \n" + "vpaddl.u32 q14, q14 \n" + "vpaddl.u32 q15, q15 \n" + "vadd.u32 d24, d24, d25 \n" + "vadd.u32 d26, d26, d27 \n" + "vadd.u32 d28, d28, d29 \n" + "vadd.u32 d30, d30, d31 \n" + "vzip.u32 q12, q14 \n" + "vzip.u32 q13, q15 \n" + "vzip.u32 q12, q13 \n" + "vadd.u32 q2, q2, q12 \n" + + "subs %0, %0, #1 \n" + + "veor.u8 q12, q7, q8 \n" + "veor.u8 q13, q7, q9 \n" + "veor.u8 q14, q7, q10 \n" + "veor.u8 q15, q7, q11 \n" + "vcnt.u8 q12, q12 \n" + "vcnt.u8 q13, q13 \n" + "vcnt.u8 q14, q14 \n" + "vcnt.u8 q15, q15 \n" + "vpaddl.u8 q12, q12 \n" + "vpaddl.u8 q13, q13 \n" + "vpaddl.u8 q14, q14 \n" + "vpaddl.u8 q15, q15 \n" + "vpaddl.u16 q12, q12 \n" + "vpaddl.u16 q13, q13 \n" + "vpaddl.u16 q14, q14 \n" + "vpaddl.u16 q15, q15 \n" + "vpaddl.u32 q12, q12 \n" + "vpaddl.u32 q13, q13 \n" + "vpaddl.u32 q14, q14 \n" + "vpaddl.u32 q15, q15 \n" + "vadd.u32 d24, d24, d25 \n" + "vadd.u32 d26, d26, d27 \n" + "vadd.u32 d28, d28, d29 \n" + "vadd.u32 d30, d30, d31 \n" + "vzip.u32 q12, q14 \n" + "vzip.u32 q13, q15 \n" + "vzip.u32 q12, q13 \n" + "vadd.u32 q3, q3, q12 \n" + "bne 0b \n" + + "vcvt.u32.f32 q0, q0 \n" + "vcvt.u32.f32 q1, q1 \n" + "vcvt.u32.f32 q2, q2 \n" + "vcvt.u32.f32 q3, q3 \n" + "vst1.32 q0, [%1]! \n" + "vst1.32 q1, [%1]! \n" + "vst1.32 q2, [%1]! \n" + "vst1.32 q3, [%1]! \n" + : "+r"(kc), // %0 + "+r"(c), // %1 + "+r"(b), // %2 + "+r"(a) // %3 + : + : "cc", "memory", "r0", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + ); + /* + "ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64 \n" + "ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x0], #64 \n" + "ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0] \n" + + "0: \n" + "ld1 {v18.2d, v19.2d, v20.2d, v21.2d}, [%3], #64 \n" + "ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [%2], #64 \n" + "eor v26.16b, v12.16b, v18.16b \n" + "eor v27.16b, v12.16b, v19.16b \n" + "eor v28.16b, v12.16b, v20.16b \n" + "eor v29.16b, v12.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "ld1 {v22.2d, v23.2d, v24.2d, v25.2d}, [%3], #64 \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "ld1 {v16.2d, v17.2d}, [%2], #32 \n" + "eor v27.16b, v12.16b, v22.16b \n" + "eor v28.16b, v12.16b, v23.16b \n" + "eor v29.16b, v12.16b, v24.16b \n" + "eor v30.16b, v12.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v0.4s, v0.4s, v26.4s \n" // delay + "add v1.4s, v1.4s, v27.4s \n" + + // The No.1 col of C is finished + + "eor v26.16b, v13.16b, v18.16b \n" + "eor v27.16b, v13.16b, v19.16b \n" + "eor v28.16b, v13.16b, v20.16b \n" + "eor v29.16b, v13.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "eor v27.16b, v13.16b, v22.16b \n" + "eor v28.16b, v13.16b, v23.16b \n" + "eor v29.16b, v13.16b, v24.16b \n" + "eor v30.16b, v13.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v2.4s, v2.4s, v26.4s \n" // delay + "add v3.4s, v3.4s, v27.4s \n" + + // The No.2 col of C is finished + + "eor v26.16b, v14.16b, v18.16b \n" + "eor v27.16b, v14.16b, v19.16b \n" + "eor v28.16b, v14.16b, v20.16b \n" + "eor v29.16b, v14.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "eor v27.16b, v14.16b, v22.16b \n" + "eor v28.16b, v14.16b, v23.16b \n" + "eor v29.16b, v14.16b, v24.16b \n" + "eor v30.16b, v14.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v4.4s, v4.4s, v26.4s \n" // delay + "add v5.4s, v5.4s, v27.4s \n" + + // The No.3 col of C is finished + + "prfm pldl1keep, [%3, #128] \n" + "eor v26.16b, v15.16b, v18.16b \n" + "eor v27.16b, v15.16b, v19.16b \n" + "eor v28.16b, v15.16b, v20.16b \n" + "eor v29.16b, v15.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "prfm pldl1keep, [%2, #128] \n" + "eor v27.16b, v15.16b, v22.16b \n" + "eor v28.16b, v15.16b, v23.16b \n" + "eor v29.16b, v15.16b, v24.16b \n" + "eor v30.16b, v15.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v6.4s, v6.4s, v26.4s \n" // delay + "add v7.4s, v7.4s, v27.4s \n" + + // The No.4 col of C is finished + + "eor v26.16b, v16.16b, v18.16b \n" + "eor v27.16b, v16.16b, v19.16b \n" + "eor v28.16b, v16.16b, v20.16b \n" + "eor v29.16b, v16.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "eor v27.16b, v16.16b, v22.16b \n" + "eor v28.16b, v16.16b, v23.16b \n" + "eor v29.16b, v16.16b, v24.16b \n" + "eor v30.16b, v16.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v8.4s, v8.4s, v26.4s \n" // delay + "add v9.4s, v9.4s, v27.4s \n" + + // The No.5 col of C is finished + + "eor v26.16b, v17.16b, v18.16b \n" + "eor v27.16b, v17.16b, v19.16b \n" + "eor v28.16b, v17.16b, v20.16b \n" + "eor v29.16b, v17.16b, v21.16b \n" + "cnt v26.16b, v26.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "addv b26, v26.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "ins v26.s[1], v27.s[0] \n" + "ins v26.s[2], v28.s[0] \n" + "ins v26.s[3], v29.s[0] \n" + + "subs %0, %0, #1 \n" + + "eor v27.16b, v17.16b, v22.16b \n" + "eor v28.16b, v17.16b, v23.16b \n" + "eor v29.16b, v17.16b, v24.16b \n" + "eor v30.16b, v17.16b, v25.16b \n" + "cnt v27.16b, v27.16b \n" + "cnt v28.16b, v28.16b \n" + "cnt v29.16b, v29.16b \n" + "cnt v30.16b, v30.16b \n" + "addv b27, v27.16b \n" + "addv b28, v28.16b \n" + "addv b29, v29.16b \n" + "addv b30, v30.16b \n" + "ins v27.s[1], v28.s[0] \n" + "ins v27.s[2], v29.s[0] \n" + "ins v27.s[3], v30.s[0] \n" + + "add v10.4s, v10.4s, v26.4s \n" // delay + "add v11.4s, v11.4s, v27.4s \n" + + // The No.6 col of C is finished + + "bne 0b \n" + + "ucvtf v0.4s, v0.4s \n" + "ucvtf v1.4s, v1.4s \n" + "ucvtf v2.4s, v2.4s \n" + "ucvtf v3.4s, v3.4s \n" + "ucvtf v4.4s, v4.4s \n" + "ucvtf v5.4s, v5.4s \n" + "st1 {v0.4s}, [%1], #16 \n" + "ucvtf v6.4s, v6.4s \n" + "st1 {v1.4s}, [%1], #16 \n" + "ucvtf v7.4s, v7.4s \n" + "st1 {v2.4s}, [%1], #16 \n" + "ucvtf v8.4s, v8.4s \n" + "st1 {v3.4s}, [%1], #16 \n" + "ucvtf v9.4s, v9.4s \n" + "st1 {v4.4s}, [%1], #16 \n" + "ucvtf v10.4s, v10.4s \n" + "st1 {v5.4s}, [%1], #16 \n" + "ucvtf v11.4s, v11.4s \n" + "st1 {v6.4s}, [%1], #16 \n" + "st1 {v7.4s}, [%1], #16 \n" + "st1 {v8.4s}, [%1], #16 \n" + "st1 {v9.4s}, [%1], #16 \n" + "st1 {v10.4s}, [%1], #16 \n" + "st1 {v11.4s}, [%1], #16 \n" + : "+r"(kc), // %0 + "+r"(c), // %1 + "+r"(b), // %2 + "+r"(a) // %3 + : + : "cc", "memory", "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", + "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", + "v28", "v29", "v30"); + */ + #endif // __aarch64__ +} +#endif // __ARM_NEON inline void bgemm_naive(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, @@ -430,8 +862,7 @@ inline void bgemm_naive(const int m, const int n, const int k, FORZ(i, m) { FORZ(j, n) { FORZ(h, k) { - C(i, j) += static_cast( - bitcount((A(i, h) ^ B(h, j)))); + C(i, j) += static_cast(bitcount((A(i, h) ^ B(h, j)))); } } } From 48cde006c61c0c830615ac69fd6c8070c29870bf Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 14:25:06 +0800 Subject: [PATCH 08/24] Fix bug of armv7 bgemm, add armv7 implemenation of maxpool and avepool (test not passed) --- .daq_pm/configs/bgemm_test_v7 | 2 +- .daq_pm/configs/net_test_v7 | 7 + dabnn/bgemm.h | 282 +--------------------------------- dabnn/layers/AvePool.cpp | 38 ++++- dabnn/layers/MaxPool.cpp | 84 +++++++++- 5 files changed, 127 insertions(+), 286 deletions(-) create mode 100644 .daq_pm/configs/net_test_v7 diff --git a/.daq_pm/configs/bgemm_test_v7 b/.daq_pm/configs/bgemm_test_v7 index 15cca2c..df044a9 100644 --- a/.daq_pm/configs/bgemm_test_v7 +++ b/.daq_pm/configs/bgemm_test_v7 @@ -3,5 +3,5 @@ name binary-nn type cpp build_dir build_test_v7 target bgemm_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-25 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/bgemm_test diff --git a/.daq_pm/configs/net_test_v7 b/.daq_pm/configs/net_test_v7 new file mode 100644 index 0000000..08309e9 --- /dev/null +++ b/.daq_pm/configs/net_test_v7 @@ -0,0 +1,7 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_test_v7 +target net_test +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +binary ~/adb_push_and_run.sh tests/net_test diff --git a/dabnn/bgemm.h b/dabnn/bgemm.h index a02ff60..0053d0d 100644 --- a/dabnn/bgemm.h +++ b/dabnn/bgemm.h @@ -562,12 +562,13 @@ inline void micro_kernel(int64_t kc, float *c, const uint64_t *a, "vzip.u32 q13, q15 \n" "vzip.u32 q12, q13 \n" "vadd.u32 q3, q3, q12 \n" + "bne 0b \n" - "vcvt.u32.f32 q0, q0 \n" - "vcvt.u32.f32 q1, q1 \n" - "vcvt.u32.f32 q2, q2 \n" - "vcvt.u32.f32 q3, q3 \n" + "vcvt.f32.u32 q0, q0 \n" + "vcvt.f32.u32 q1, q1 \n" + "vcvt.f32.u32 q2, q2 \n" + "vcvt.f32.u32 q3, q3 \n" "vst1.32 q0, [%1]! \n" "vst1.32 q1, [%1]! \n" "vst1.32 q2, [%1]! \n" @@ -579,279 +580,6 @@ inline void micro_kernel(int64_t kc, float *c, const uint64_t *a, : : "cc", "memory", "r0", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" ); - /* - "ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x0], #64 \n" - "ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x0], #64 \n" - "ld1 {v8.4s, v9.4s, v10.4s, v11.4s}, [x0] \n" - - "0: \n" - "ld1 {v18.2d, v19.2d, v20.2d, v21.2d}, [%3], #64 \n" - "ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [%2], #64 \n" - "eor v26.16b, v12.16b, v18.16b \n" - "eor v27.16b, v12.16b, v19.16b \n" - "eor v28.16b, v12.16b, v20.16b \n" - "eor v29.16b, v12.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "ld1 {v22.2d, v23.2d, v24.2d, v25.2d}, [%3], #64 \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "ld1 {v16.2d, v17.2d}, [%2], #32 \n" - "eor v27.16b, v12.16b, v22.16b \n" - "eor v28.16b, v12.16b, v23.16b \n" - "eor v29.16b, v12.16b, v24.16b \n" - "eor v30.16b, v12.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v0.4s, v0.4s, v26.4s \n" // delay - "add v1.4s, v1.4s, v27.4s \n" - - // The No.1 col of C is finished - - "eor v26.16b, v13.16b, v18.16b \n" - "eor v27.16b, v13.16b, v19.16b \n" - "eor v28.16b, v13.16b, v20.16b \n" - "eor v29.16b, v13.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "eor v27.16b, v13.16b, v22.16b \n" - "eor v28.16b, v13.16b, v23.16b \n" - "eor v29.16b, v13.16b, v24.16b \n" - "eor v30.16b, v13.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v2.4s, v2.4s, v26.4s \n" // delay - "add v3.4s, v3.4s, v27.4s \n" - - // The No.2 col of C is finished - - "eor v26.16b, v14.16b, v18.16b \n" - "eor v27.16b, v14.16b, v19.16b \n" - "eor v28.16b, v14.16b, v20.16b \n" - "eor v29.16b, v14.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "eor v27.16b, v14.16b, v22.16b \n" - "eor v28.16b, v14.16b, v23.16b \n" - "eor v29.16b, v14.16b, v24.16b \n" - "eor v30.16b, v14.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v4.4s, v4.4s, v26.4s \n" // delay - "add v5.4s, v5.4s, v27.4s \n" - - // The No.3 col of C is finished - - "prfm pldl1keep, [%3, #128] \n" - "eor v26.16b, v15.16b, v18.16b \n" - "eor v27.16b, v15.16b, v19.16b \n" - "eor v28.16b, v15.16b, v20.16b \n" - "eor v29.16b, v15.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "prfm pldl1keep, [%2, #128] \n" - "eor v27.16b, v15.16b, v22.16b \n" - "eor v28.16b, v15.16b, v23.16b \n" - "eor v29.16b, v15.16b, v24.16b \n" - "eor v30.16b, v15.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v6.4s, v6.4s, v26.4s \n" // delay - "add v7.4s, v7.4s, v27.4s \n" - - // The No.4 col of C is finished - - "eor v26.16b, v16.16b, v18.16b \n" - "eor v27.16b, v16.16b, v19.16b \n" - "eor v28.16b, v16.16b, v20.16b \n" - "eor v29.16b, v16.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "eor v27.16b, v16.16b, v22.16b \n" - "eor v28.16b, v16.16b, v23.16b \n" - "eor v29.16b, v16.16b, v24.16b \n" - "eor v30.16b, v16.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v8.4s, v8.4s, v26.4s \n" // delay - "add v9.4s, v9.4s, v27.4s \n" - - // The No.5 col of C is finished - - "eor v26.16b, v17.16b, v18.16b \n" - "eor v27.16b, v17.16b, v19.16b \n" - "eor v28.16b, v17.16b, v20.16b \n" - "eor v29.16b, v17.16b, v21.16b \n" - "cnt v26.16b, v26.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "addv b26, v26.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "ins v26.s[1], v27.s[0] \n" - "ins v26.s[2], v28.s[0] \n" - "ins v26.s[3], v29.s[0] \n" - - "subs %0, %0, #1 \n" - - "eor v27.16b, v17.16b, v22.16b \n" - "eor v28.16b, v17.16b, v23.16b \n" - "eor v29.16b, v17.16b, v24.16b \n" - "eor v30.16b, v17.16b, v25.16b \n" - "cnt v27.16b, v27.16b \n" - "cnt v28.16b, v28.16b \n" - "cnt v29.16b, v29.16b \n" - "cnt v30.16b, v30.16b \n" - "addv b27, v27.16b \n" - "addv b28, v28.16b \n" - "addv b29, v29.16b \n" - "addv b30, v30.16b \n" - "ins v27.s[1], v28.s[0] \n" - "ins v27.s[2], v29.s[0] \n" - "ins v27.s[3], v30.s[0] \n" - - "add v10.4s, v10.4s, v26.4s \n" // delay - "add v11.4s, v11.4s, v27.4s \n" - - // The No.6 col of C is finished - - "bne 0b \n" - - "ucvtf v0.4s, v0.4s \n" - "ucvtf v1.4s, v1.4s \n" - "ucvtf v2.4s, v2.4s \n" - "ucvtf v3.4s, v3.4s \n" - "ucvtf v4.4s, v4.4s \n" - "ucvtf v5.4s, v5.4s \n" - "st1 {v0.4s}, [%1], #16 \n" - "ucvtf v6.4s, v6.4s \n" - "st1 {v1.4s}, [%1], #16 \n" - "ucvtf v7.4s, v7.4s \n" - "st1 {v2.4s}, [%1], #16 \n" - "ucvtf v8.4s, v8.4s \n" - "st1 {v3.4s}, [%1], #16 \n" - "ucvtf v9.4s, v9.4s \n" - "st1 {v4.4s}, [%1], #16 \n" - "ucvtf v10.4s, v10.4s \n" - "st1 {v5.4s}, [%1], #16 \n" - "ucvtf v11.4s, v11.4s \n" - "st1 {v6.4s}, [%1], #16 \n" - "st1 {v7.4s}, [%1], #16 \n" - "st1 {v8.4s}, [%1], #16 \n" - "st1 {v9.4s}, [%1], #16 \n" - "st1 {v10.4s}, [%1], #16 \n" - "st1 {v11.4s}, [%1], #16 \n" - : "+r"(kc), // %0 - "+r"(c), // %1 - "+r"(b), // %2 - "+r"(a) // %3 - : - : "cc", "memory", "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", - "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", - "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", - "v28", "v29", "v30"); - */ - #endif // __aarch64__ } #endif // __ARM_NEON diff --git a/dabnn/layers/AvePool.cpp b/dabnn/layers/AvePool.cpp index 6d1395b..f8d2658 100644 --- a/dabnn/layers/AvePool.cpp +++ b/dabnn/layers/AvePool.cpp @@ -7,7 +7,7 @@ namespace bnn { -#ifdef __aarch64__ +#ifdef __ARM_NEON void ave_pool_2x2_s2(const bnn::Mat &input, bnn::Mat &output) { FORZ(h, output.h) { FORZ(w, output.w) { @@ -17,6 +17,7 @@ void ave_pool_2x2_s2(const bnn::Mat &input, bnn::Mat &output) { const float *ptr3 = input.point(h * 2 + 1, w * 2 + 1); float *output_ptr = output.point(h, w); size_t nn = input.c >> 2; +#ifdef __aarch64__ asm volatile( "fmov s30, #4.0 \n" "dup v30.4s, v30.s[0] \n" @@ -46,10 +47,39 @@ void ave_pool_2x2_s2(const bnn::Mat &input, bnn::Mat &output) { : : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v30"); +#else // __aarch64__ + asm volatile( + "vmov.f32 q13, #0.25 \n" + "0: \n" + "vld1.32 q0, [%0]! \n" + "pld [%0, #128] \n" + "vld1.32 q1, [%1]! \n" + "pld [%1, #128] \n" + "vld1.32 q2, [%2]! \n" + "pld [%2, #128] \n" + "vld1.32 q3, [%3]! \n" + "pld [%3, #128] \n" + "vadd.f32 q0, q0, q1 \n" + "vadd.f32 q2, q2, q3 \n" + "vadd.f32 q0, q0, q2 \n" + "vmul.f32 q0, q0, q13 \n" + "subs %5, %5, #1 \n" + "vst1.32 q0, [%4]! \n" + "bne 0b \n" + + : "+r"(ptr0), // %0 + "+r"(ptr1), // %1 + "+r"(ptr2), // %2 + "+r"(ptr3), // %3 + "+r"(output_ptr), // %4 + "+r"(nn) // %5 + : + : "cc", "memory", "q0", "q1", "q2", "q3", "q13"); +#endif // __aarch64__ } } } -#endif // __aarch64__ +#endif // __ARM_NEON void ave_pool_fallback(const bnn::Mat &input, const size_t pad_h, const size_t pad_w, const size_t stride_h, @@ -116,7 +146,7 @@ AvePool::AvePool(NetCP net, const std::string &name, css input, css output, } void AvePool::forward_impl() const { -#ifdef __aarch64__ +#ifdef __ARM_NEON if (stride_h == 2 && stride_w == 2 && kernel_h == 2 && kernel_w == 2 && input_mat->c % 4 == 0) { pad(*input_mat, pad_h, pad_w, *padded_mat); @@ -128,7 +158,7 @@ void AvePool::forward_impl() const { #else ave_pool_fallback(*input_mat, pad_h, pad_w, stride_h, stride_w, kernel_h, kernel_w, *output_mat); -#endif // __aarch64__ +#endif // __ARM_NEON } } // namespace bnn diff --git a/dabnn/layers/MaxPool.cpp b/dabnn/layers/MaxPool.cpp index 7fd965a..15202f2 100644 --- a/dabnn/layers/MaxPool.cpp +++ b/dabnn/layers/MaxPool.cpp @@ -9,7 +9,7 @@ namespace bnn { -#ifdef __aarch64__ +#ifdef __ARM_NEON void maxpool2x2(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, const int stride_w = 1) { FORZ(h, output.h) { @@ -24,6 +24,7 @@ void maxpool2x2(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, input.point(h * stride_h + 1, w * stride_w + 1); float *output_ptr = output.point(h, w); size_t nn = input.c >> 2; +#ifdef __aarch64__ asm volatile( "0: \n" "ld1 {v0.4s}, [%0], #16 \n" @@ -50,6 +51,33 @@ void maxpool2x2(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, : : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12"); +#else // __aarch64__ + asm volatile( + "0: \n" + "vld1.32 q0, [%0]! \n" + "pld [%0, #128] \n" + "vld1.32 q1, [%1]! \n" + "pld [%1, #128] \n" + "vld1.32 q2, [%2]! \n" + "pld [%2, #128] \n" + "vld1.32 q3, [%3]! \n" + "pld [%3, #128] \n" + "vmax.f32 q0, q0, q1 \n" + "vmax.f32 q2, q2, q3 \n" + "vmax.f32 q0, q2, q2 \n" + "subs %5, %5, #1 \n" + "vst1.32 q0, [%4]! \n" + "bne 0b \n" + + : "+r"(ptr0), // %0 + "+r"(ptr1), // %1 + "+r"(ptr2), // %2 + "+r"(ptr3), // %3 + "+r"(output_ptr), // %4 + "+r"(nn) // %5 + : + : "cc", "memory", "q0", "q1", "q2", "q3"); +#endif // __aarch64__ } } } @@ -78,6 +106,7 @@ void maxpool3x3(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, input.point(h * stride_h + 2, w * stride_w + 2); float *output_ptr = output.point(h, w); size_t nn = input.c >> 2; +#ifdef __aarch64__ asm volatile( "0: \n" "ld1 {v0.4s}, [%0], #16 \n" @@ -124,10 +153,57 @@ void maxpool3x3(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, : : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12"); +#else + asm volatile( + "0: \n" + "vld1.32 q0, [%0]! \n" + "pld [%0, #128] \n" + "vld1.32 q1, [%1]! \n" + "pld [%1, #128] \n" + "vld1.32 q2, [%2]! \n" + "pld [%2, #128] \n" + "vld1.32 q3, [%3]! \n" + "pld [%3, #128] \n" + "vmax.f32 q0, q0, q1 \n" + "vld1.32 q4, [%4]! \n" + "pld [%4, #128] \n" + "vmax.f32 q2, q2, q3 \n" + "vld1.32 q5, [%5]! \n" + "pld [%5, #128] \n" + "vld1.32 q6, [%6]! \n" + "pld [%6, #128] \n" + "vmax.f32 q4, q4, q5 \n" + "vld1.32 q7, [%7]! \n" + "pld [%7, #128] \n" + "vld1.32 q8, [%8]! \n" + "pld [%8, #128] \n" + "vmax.f32 q2, q2, q8 \n" + "vmax.f32 q6, q6, q7 \n" + "vmax.f32 q0, q0, q2 \n" + "subs %10, %10, #1 \n" + "vmax.f32 q4, q4, q6 \n" + "vmax.f32 q0, q0, q4 \n" + "vst1.32 q0, [%9]! \n" + "bne 0b \n" + + : "+r"(ptr0), // %0 + "+r"(ptr1), // %1 + "+r"(ptr2), // %2 + "+r"(ptr3), // %3 + "+r"(ptr4), // %4 + "+r"(ptr5), // %5 + "+r"(ptr6), // %6 + "+r"(ptr7), // %7 + "+r"(ptr8), // %8 + "+r"(output_ptr), // %9 + "+r"(nn) // %10 + : + : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8"); +#endif } } } -#endif // __aarch64__ +#endif // __ARM_NEON MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, int kernel_h, int kernel_w, int pad_h, int pad_w, int stride_h, @@ -152,7 +228,7 @@ MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, padded_mat = mat_map[pad_name]; } void MaxPool::forward_impl() const { -#ifdef __aarch64__ +#ifdef __ARM_NEON // std::numeric_limits::min() is the closest value to 0, so we uses // -max() pad(*input_mat, pad_h, pad_w, *padded_mat, @@ -169,7 +245,7 @@ void MaxPool::forward_impl() const { } #else std::invalid_argument("Not supported max_pool"); -#endif // __aarch64__ +#endif // __aarch64__ } std::string MaxPool::to_str() const { From 847cc2533091a344ed8e35554b9fc51691643e26 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 14:24:13 +0800 Subject: [PATCH 09/24] Fix configuration which doesn't enable neon --- .daq_pm/configs/bgemm_test_v7 | 2 +- .daq_pm/configs/net_test_v7 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.daq_pm/configs/bgemm_test_v7 b/.daq_pm/configs/bgemm_test_v7 index df044a9..d8a6f3d 100644 --- a/.daq_pm/configs/bgemm_test_v7 +++ b/.daq_pm/configs/bgemm_test_v7 @@ -3,5 +3,5 @@ name binary-nn type cpp build_dir build_test_v7 target bgemm_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-25 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-25 -DANDROID_ABI="armeabi-v7a with NEON" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/bgemm_test diff --git a/.daq_pm/configs/net_test_v7 b/.daq_pm/configs/net_test_v7 index 08309e9..d2e3baf 100644 --- a/.daq_pm/configs/net_test_v7 +++ b/.daq_pm/configs/net_test_v7 @@ -3,5 +3,5 @@ name binary-nn type cpp build_dir build_test_v7 target net_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI=armeabi-v7a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI="armeabi-v7a with NEON" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/net_test From 3294539867e2b5d0b42b09af45766a4252fac549 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 14:25:41 +0800 Subject: [PATCH 10/24] Fix maxpool that doesn't throw exception --- dabnn/layers/MaxPool.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dabnn/layers/MaxPool.cpp b/dabnn/layers/MaxPool.cpp index 15202f2..997fbfc 100644 --- a/dabnn/layers/MaxPool.cpp +++ b/dabnn/layers/MaxPool.cpp @@ -241,10 +241,10 @@ void MaxPool::forward_impl() const { } else if (kernel_h == 2 && kernel_w == 2) { maxpool2x2(*padded_mat, *output_mat, stride_h, stride_w); } else { - std::invalid_argument("Not supported max_pool"); + throw std::invalid_argument("Not supported max_pool"); } #else - std::invalid_argument("Not supported max_pool"); + throw std::invalid_argument("Not supported max_pool"); #endif // __aarch64__ } From 1f47ce71050a48b4b9c18402bcc47e1378d74b27 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 14:34:20 +0800 Subject: [PATCH 11/24] Fix bug in armv7 maxpool 2x2 --- dabnn/layers/MaxPool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dabnn/layers/MaxPool.cpp b/dabnn/layers/MaxPool.cpp index 997fbfc..2146374 100644 --- a/dabnn/layers/MaxPool.cpp +++ b/dabnn/layers/MaxPool.cpp @@ -64,7 +64,7 @@ void maxpool2x2(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, "pld [%3, #128] \n" "vmax.f32 q0, q0, q1 \n" "vmax.f32 q2, q2, q3 \n" - "vmax.f32 q0, q2, q2 \n" + "vmax.f32 q0, q0, q2 \n" "subs %5, %5, #1 \n" "vst1.32 q0, [%4]! \n" "bne 0b \n" From 5a4fc6ebcd3158a3f1a05cbc5d2d2819ac508713 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 14:34:32 +0800 Subject: [PATCH 12/24] Add max pool fallback --- dabnn/layers/MaxPool.cpp | 58 +++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/dabnn/layers/MaxPool.cpp b/dabnn/layers/MaxPool.cpp index 2146374..68079d4 100644 --- a/dabnn/layers/MaxPool.cpp +++ b/dabnn/layers/MaxPool.cpp @@ -205,6 +205,45 @@ void maxpool3x3(const bnn::Mat &input, bnn::Mat &output, const int stride_h = 1, } #endif // __ARM_NEON +void max_pool_fallback(const bnn::Mat &input, const size_t pad_h, + const size_t pad_w, const size_t stride_h, + const size_t stride_w, const size_t kernel_h, + const size_t kernel_w, bnn::Mat &output) { + const int output_h = + (input.h + 2 * pad_h - ((kernel_h - 1) + 1)) / stride_h + 1; + const int output_w = + (input.w + 2 * pad_w - ((kernel_w - 1) + 1)) / stride_w + 1; + + BNN_ASSERT(input.w * input.c * input.elemsize % 16 == 0, "Not align"); + BNN_ASSERT(output.w * output.c * output.elemsize % 16 == 0, "Not align"); + + int input_y = 0; + FORZ(output_y, output_h) { + int input_x = 0; + FORZ(output_x, output_w) { + FORZ(output_c, input.c) { + float m = -std::numeric_limits::max(); + FORZ(kh, kernel_h) { + int y = input_y - pad_h + kh; + const float *input_ptr = input.point(y, 0); + FORZ(kw, kernel_w) { + int x = input_x - pad_w + kw; + if (!(y < 0 || y >= input.h || x < 0 || x >= input.w)) { + const auto val = input_ptr[x * input.c + output_c]; + m = std::max(m, val); + } + } + } + + output[output_y * output_w * input.c + output_x * input.c + + output_c] = m; + } + input_x += stride_w; + } + input_y += stride_h; + } +} + MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, int kernel_h, int kernel_w, int pad_h, int pad_w, int stride_h, int stride_w) @@ -229,22 +268,23 @@ MaxPool::MaxPool(NetCP net, const std::string &name, css input, css output, } void MaxPool::forward_impl() const { #ifdef __ARM_NEON - // std::numeric_limits::min() is the closest value to 0, so we uses - // -max() - pad(*input_mat, pad_h, pad_w, *padded_mat, - -std::numeric_limits::max()); - BNN_ASSERT( - (kernel_h == 3 && kernel_w == 3) || (kernel_h == 2 && kernel_w == 2), - "Not supported max_pool"); if (kernel_h == 3 && kernel_w == 3) { + // std::numeric_limits::min() is the closest value to 0, so we uses + // -max() + pad(*input_mat, pad_h, pad_w, *padded_mat, + -std::numeric_limits::max()); maxpool3x3(*padded_mat, *output_mat, stride_h, stride_w); } else if (kernel_h == 2 && kernel_w == 2) { + pad(*input_mat, pad_h, pad_w, *padded_mat, + -std::numeric_limits::max()); maxpool2x2(*padded_mat, *output_mat, stride_h, stride_w); } else { - throw std::invalid_argument("Not supported max_pool"); + max_pool_fallback(*input_mat, pad_h, pad_w, stride_h, stride_w, + kernel_h, kernel_w, *output_mat); } #else - throw std::invalid_argument("Not supported max_pool"); + max_pool_fallback(*input_mat, pad_h, pad_w, stride_h, stride_w, + kernel_h, kernel_w, *output_mat); #endif // __aarch64__ } From 1dbc2cabdbbd885b20fd02727aec24c360586950 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 16:57:34 +0800 Subject: [PATCH 13/24] [daq_pm] Build net_test for android-21 instead of android-28 --- .daq_pm/configs/net_test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.daq_pm/configs/net_test b/.daq_pm/configs/net_test index 31da42e..58ec92c 100644 --- a/.daq_pm/configs/net_test +++ b/.daq_pm/configs/net_test @@ -3,5 +3,5 @@ name binary-nn type cpp build_dir build_net_test target net_test -cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-28 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI=arm64-v8a -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja binary ~/adb_push_and_run.sh tests/net_test From 56a38479608934aa1e5f2580f684eb0c5e64ae85 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 16:58:30 +0800 Subject: [PATCH 14/24] fined im2col mat size --- dabnn/layers/BinConv.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index 2c7b599..c8479d2 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -30,8 +30,9 @@ BinConv::BinConv(NetCP net, const std::string &name, css input, css weight, } const auto col_mat_name = "col_mat"; if (mat_map.find(col_mat_name) == mat_map.end()) { + const auto len = output_mat->h * output_mat->w * weight_mat->h * weight_mat->w * input_mat->elem_c; mat_map[col_mat_name] = - std::make_shared(999999, bnn::DataType::Bit); + std::make_shared(len, bnn::DataType::Bit); } padded_mat = mat(pad_name); From b68345bd6b2987de00b5c046f320f2871fcde934 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 16:58:50 +0800 Subject: [PATCH 15/24] Add the missing require_align=False for trans_weight_mat --- dabnn/layers/BinConv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index c8479d2..1ffe8ab 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -46,7 +46,7 @@ BinConv::BinConv(NetCP net, const std::string &name, css input, css weight, const int k = weight_mat->h * weight_mat->w * weight_mat->c; transposed_weight_mat = std::make_shared(weight_mat->n, weight_mat->h, weight_mat->w, - weight_mat->elem_c, DataType::Bit); + weight_mat->elem_c, DataType::Bit, false); auto *trans_data_ptr = static_cast(transposed_weight_mat->data); auto *data_ptr = static_cast(weight_mat->data); From 5eda6d2ba2f0ae4f500f744fe3ac4b6542eb5650 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 16:59:10 +0800 Subject: [PATCH 16/24] Fix the wrong gemm_compatible() --- dabnn/layers/BinConv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index 1ffe8ab..24b8054 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -87,7 +87,7 @@ bool BinConv::direct_conv_compatible() const { bool BinConv::gemm_compatible() const { #ifdef __aarch64__ - return weight_mat->h * weight_mat->n * weight_mat->c % 2 == 0; + return weight_mat->h * weight_mat->w * weight_mat->c % 2 == 0; #else return false; #endif From 0678418ca61fa073555f65446da54c1be8f9b717 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 16:59:52 +0800 Subject: [PATCH 17/24] Update operator== of Mat, add support for nan and Bit datatype --- dabnn/mat.h | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/dabnn/mat.h b/dabnn/mat.h index d500212..d31eaed 100644 --- a/dabnn/mat.h +++ b/dabnn/mat.h @@ -271,10 +271,32 @@ inline bool Mat::operator==(const Mat &m) const { h == m.h && c == m.c && data_type == m.data_type)) { return false; } - FORZ(i, total()) { - if (std::abs(static_cast(data)[i] - m[i]) > 1e-5) { - return false; + if (m.data_type == DataType::Float) { + FORZ(i, total()) { + const auto elem = static_cast(data)[i]; + if (std::isnan(elem) && !std::isnan(m[i])) { + PNT(elem, m[i]); + return false; + } + if (!std::isnan(elem) && std::isnan(m[i])) { + PNT(elem, m[i]); + return false; + } + if (std::abs(elem - m[i]) > 1e-5) { + PNT(i, elem, m[i]); + return false; + } } + } else if (m.data_type == DataType::Bit) { + FORZ(i, total()) { + const auto elem = static_cast(data)[i]; + if (elem != m[i]) { + PNT(elem, m[i]); + return false; + } + } + } else { + throw std::invalid_argument("Unknown datatype"); } return true; } From 85598444f9f029dace096a636662e02819fe16d1 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 17:00:23 +0800 Subject: [PATCH 18/24] Update error message for inner_kernel k%2==0 --- dabnn/bgemm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dabnn/bgemm.h b/dabnn/bgemm.h index 0053d0d..9563833 100644 --- a/dabnn/bgemm.h +++ b/dabnn/bgemm.h @@ -70,7 +70,7 @@ inline void inner_kernel(const int m, const int n, const int k, const uint64_t *a, const int lda, const uint64_t *b, const int ldb, float *c, const int ldc, const int first_time) { - BNN_ASSERT(k % 2 == 0, "k % 2 should be 0"); + BNN_ASSERT(k % 2 == 0, "k % 2 should be 0, k =", k); BNN_ASSERT(k * P < 128000, ""); BNN_ASSERT(k * R < 128000, ""); From 5af2ec3d93bb4198c06c5336307b5cc510e80a5b Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 17:00:40 +0800 Subject: [PATCH 19/24] Fix bug: output_mat is not inited in bgemm --- dabnn/layers/BinConv.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index 24b8054..91ad541 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -99,6 +99,7 @@ void BinConv::forward_impl() const { pad(*input_mat, pad_h, pad_w, *padded_mat); bconv_3x3(*padded_mat, *weight_mat, *output_mat, stride_h); } else if (gemm_compatible()) { + output_mat->fill(0.f); bnn::im2col(*input_mat, weight_mat->h, weight_mat->w, pad_h, pad_w, stride_h, stride_w, 1, 1, *col_mat); const int m = weight_mat->n; From de3f85ff3f888a52ae49da365155bda2e24e0ca5 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 17:00:47 +0800 Subject: [PATCH 20/24] Enable bgemm for armv7 --- dabnn/layers/BinConv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dabnn/layers/BinConv.cpp b/dabnn/layers/BinConv.cpp index 91ad541..e6bdf79 100644 --- a/dabnn/layers/BinConv.cpp +++ b/dabnn/layers/BinConv.cpp @@ -86,7 +86,7 @@ bool BinConv::direct_conv_compatible() const { } bool BinConv::gemm_compatible() const { -#ifdef __aarch64__ +#ifdef __ARM_NEON return weight_mat->h * weight_mat->w * weight_mat->c % 2 == 0; #else return false; From 94dab1850578382dbca7cc01bdba15defc9718d9 Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 18:18:07 +0800 Subject: [PATCH 21/24] Add armv7 test --- ci/build_dabnn_v7.sh | 11 +++++++ ci/dabnn_build_and_test.yml | 54 +++++++++++++++++++-------------- ci/start_android_emulator_v7.sh | 25 +++++++++++++++ ci/template_dabnn_run_test.yml | 9 ++++++ 4 files changed, 76 insertions(+), 23 deletions(-) create mode 100755 ci/build_dabnn_v7.sh create mode 100755 ci/start_android_emulator_v7.sh create mode 100644 ci/template_dabnn_run_test.yml diff --git a/ci/build_dabnn_v7.sh b/ci/build_dabnn_v7.sh new file mode 100755 index 0000000..6ee2ba5 --- /dev/null +++ b/ci/build_dabnn_v7.sh @@ -0,0 +1,11 @@ +#! /usr/bin/env bash +set -e + +echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'ndk-bundle' +nproc=$(ci/get_cores.sh) + +mkdir build_dabnn && cd build_dabnn +cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_HOME/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI="armeabi-v7a with NEON" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release .. +cmake --build . -- -j$nproc +cd - + diff --git a/ci/dabnn_build_and_test.yml b/ci/dabnn_build_and_test.yml index 94c9373..284805e 100644 --- a/ci/dabnn_build_and_test.yml +++ b/ci/dabnn_build_and_test.yml @@ -22,26 +22,34 @@ pr: - README.md - docs/* -pool: - vmImage: 'macOS-10.14' -steps: -- checkout: self - submodules: true -- bash: brew install watch gnu-sed - displayName: Install watch and gnu-sed -- bash: ci/build_dabnn.sh - displayName: Build -- bash: ci/start_android_emulator.sh - displayName: Start Android Emulator -- bash: ci/adb_push_and_run.sh build_dabnn/tests/bconv_test - displayName: Binary Conv Test -- bash: ci/adb_push_and_run.sh build_dabnn/tests/bgemm_test - displayName: Binary Gemm Test -- bash: ci/download_models.sh - displayName: Download Models -- bash: ci/adb_push_and_run.sh build_dabnn/tests/net_test - displayName: Model Test -- bash: ci/build_aar.sh - env: - BINTRAY_KEY: $(bintrayKey) - displayName: Build and Publish AAR package +jobs: +- job: aarch64 + pool: + vmImage: 'macOS-10.14' + steps: + - checkout: self + submodules: true + - bash: brew install watch gnu-sed + displayName: Install watch and gnu-sed + - bash: ci/build_dabnn.sh + displayName: Build + - bash: ci/start_android_emulator.sh + displayName: Start Android Emulator + - template: template_dabnn_run_test.yml + - bash: ci/build_aar.sh + env: + BINTRAY_KEY: $(bintrayKey) + displayName: Build and Publish AAR package +- job: armv7a_with_NEON + pool: + vmImage: 'macOS-10.14' + steps: + - checkout: self + submodules: true + - bash: brew install watch gnu-sed + displayName: Install watch and gnu-sed + - bash: ci/build_dabnn_v7.sh + displayName: Build + - bash: ci/start_android_emulator_v7.sh + displayName: Start Android Emulator + - template: template_dabnn_run_test.yml diff --git a/ci/start_android_emulator_v7.sh b/ci/start_android_emulator_v7.sh new file mode 100755 index 0000000..05e37e9 --- /dev/null +++ b/ci/start_android_emulator_v7.sh @@ -0,0 +1,25 @@ +#! /usr/bin/env bash +set -e + +export TERM=xterm + +echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;android-25;google_apis;armeabi-v7a' + +echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n android_emulator -k 'system-images;android-25;google_apis;armeabi-v7a' --force + +echo "Starting emulator" + +# Start emulator in background +nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -no-audio & + +# start server in advance, so that the result of watch will only change when device gets online +$ANDROID_HOME/platform-tools/adb start-server + +watch -g -n 1 '$ANDROID_HOME/platform-tools/adb devices | grep -c device$' + +echo "Emulator is online" + +$ANDROID_HOME/platform-tools/adb devices + +echo "Emulator started" + diff --git a/ci/template_dabnn_run_test.yml b/ci/template_dabnn_run_test.yml new file mode 100644 index 0000000..a8923d7 --- /dev/null +++ b/ci/template_dabnn_run_test.yml @@ -0,0 +1,9 @@ +steps: +- bash: ci/adb_push_and_run.sh build_dabnn/tests/bconv_test + displayName: Binary Conv Test +- bash: ci/adb_push_and_run.sh build_dabnn/tests/bgemm_test + displayName: Binary Gemm Test +- bash: ci/download_models.sh + displayName: Download Models +- bash: ci/adb_push_and_run.sh build_dabnn/tests/net_test + displayName: Model Test From 4751fa14bdb821be38af4cb2af5d449b4b9ae51e Mon Sep 17 00:00:00 2001 From: daquexian Date: Wed, 29 May 2019 19:48:06 +0800 Subject: [PATCH 22/24] Add guard in unsupported functions --- .daq_pm/configs/all_v7 | 5 +++++ benchmark/benchmark.cpp | 8 ++++++++ tests/bitpack_test.cpp | 4 ++++ 3 files changed, 17 insertions(+) create mode 100644 .daq_pm/configs/all_v7 diff --git a/.daq_pm/configs/all_v7 b/.daq_pm/configs/all_v7 new file mode 100644 index 0000000..46e05de --- /dev/null +++ b/.daq_pm/configs/all_v7 @@ -0,0 +1,5 @@ +# It is a configuration file for [project_manager.vim](https://github.com/daquexian/project_manager.vim) +name binary-nn +type cpp +build_dir build_v7 +cmake_options -DCMAKE_TOOLCHAIN_FILE=~/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DANDROID_ABI="armeabi-v7a with NEON" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release -GNinja diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 9fcbfcc..be940c4 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -21,6 +21,7 @@ static void BM_pack_mat_64_small(benchmark::State &state) { } } +#ifdef __aarch64__ static void BM_pack_mat_128_small(benchmark::State &state) { const bnn::Mat a(1, 32, 32, 128, bnn::DataType::Float, 0); bnn::Mat b(1, 32, 32, 128, bnn::DataType::Bit, 0); @@ -28,6 +29,7 @@ static void BM_pack_mat_128_small(benchmark::State &state) { pack_mat_128(a, b); } } +#endif // __aarch64__ static void BM_pack_mat_64(benchmark::State &state) { const bnn::Mat a(1, 64, 64, 128, bnn::DataType::Float); @@ -37,6 +39,7 @@ static void BM_pack_mat_64(benchmark::State &state) { } } +#ifdef __aarch64__ static void BM_pack_mat_128(benchmark::State &state) { const bnn::Mat a(1, 64, 64, 128, bnn::DataType::Float); bnn::Mat b(1, 64, 64, 128, bnn::DataType::Bit); @@ -44,6 +47,7 @@ static void BM_pack_mat_128(benchmark::State &state) { pack_mat_128(a, b); } } +#endif // __aarch64__ #define SETUP_BCONV_FLOAT(size_a, size_b, num_output) \ const size_t AHEIGHT = size_a; \ @@ -73,6 +77,7 @@ static void BM_pack_mat_128(benchmark::State &state) { \ bnn::Mat c(CHEIGHT, CWIDTH, NUM_OUTPUT, bnn::DataType::Float); +#ifdef __aarch64__ static void BM_bconv_float_3x3_128(benchmark::State &state) { SETUP_BCONV_FLOAT(30, 3, 128); for (auto _ : state) { @@ -88,6 +93,7 @@ static void BM_bconv_float_1x1_128(benchmark::State &state) { bnn::bconv_1x1_128(a_binary, b, c); } } +#endif // __aarch64__ #undef SETUP_BCONV_FLOAT @@ -135,6 +141,7 @@ static void BM_bnn_bconv_1x1_naive_128(benchmark::State &state) { } } +#ifdef __aarch64__ static void BM_bnn_bconv_1x1_64(benchmark::State &state) { SETUP_BCONV(56, 1, 64, 1); for (auto _ : state) { @@ -162,6 +169,7 @@ static void BM_bnn_bconv_1x1_512(benchmark::State &state) { bnn::bconv_1x1_512(a, b, c); } } +#endif // __aarch64__ static void BM_bnn_bconv_3x3_64(benchmark::State &state) { SETUP_BCONV(58, 3, 64, 1); diff --git a/tests/bitpack_test.cpp b/tests/bitpack_test.cpp index 67d3645..dd7c97f 100644 --- a/tests/bitpack_test.cpp +++ b/tests/bitpack_test.cpp @@ -9,6 +9,7 @@ #include #include +#ifdef __aarch64__ TEST(bitpack, pack_mat_128) { const size_t AHEIGHT = 64; const size_t AWIDTH = 64; @@ -32,6 +33,7 @@ TEST(bitpack, pack_mat_128) { bitcount(*(static_cast(expected) + i + 1))); } } +#endif // __aarch64__ TEST(bitpack, pack_mat_64) { const size_t AHEIGHT = 64; @@ -57,6 +59,7 @@ TEST(bitpack, pack_mat_64) { } } +#ifdef __aarch64__ TEST(bitpack, pack_mat_fallback) { const size_t AHEIGHT = 64; const size_t AWIDTH = 64; @@ -74,6 +77,7 @@ TEST(bitpack, pack_mat_fallback) { ASSERT_EQ(a_binary, expected); } +#endif // __aarch64__ TEST(bitpack, addv_v7) { uint64_t data[2]; From e1a6de3bc21acbe2c9e306678999b358a1b85fdf Mon Sep 17 00:00:00 2001 From: daquexian Date: Sat, 1 Jun 2019 19:00:37 +0800 Subject: [PATCH 23/24] Update README.md --- README.md | 4 ++-- README_CN.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cf99a1a..e099b1a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Join chat at [Gitter (English)](https://gitter.im/dabnn/dabnn) or QQ Group (Chin Binary neural networks (BNNs) have great potential on edge devices since they replace float operations by efficient bit-wise operations. However, to leverage the efficiency of bit-wise operations, the reimplmentation of convolution layer and also other layers is needed. -To our best knowledge, dabnn is the first highly-optimized binary neural networks inference framework for mobile platform. We implemented binary convolutions with armv8 assembly. On Google Pixel 1, our dabnn is as **800%~2400% faster** as [BMXNet](https://github.com/hpi-xnor/BMXNet) (the only one open-sourced BNN inference framework except dabnn to our best knowledge) on a single binary convolution, and as about **700% faster** as it on binarized ResNet-18. +To our best knowledge, dabnn is the first highly-optimized binary neural networks inference framework for mobile platform. We implemented binary convolutions with ARM assembly. On Google Pixel 1, our dabnn is as **800%~2400% faster** as [BMXNet](https://github.com/hpi-xnor/BMXNet) (the only one open-sourced BNN inference framework except dabnn to our best knowledge) on a single binary convolution, and as about **700% faster** as it on binarized ResNet-18. ## Benchmark and Comparison @@ -50,7 +50,7 @@ We provide a conversion tool, named onnx2bnn, to convert an ONNX model to a dabn Note: Binary convolution is a custom operator, so whether the ONNX model is dabnn-comptabile heavily depends on the implementation of the binary convolution in the training code. Please check out [our wiki](https://github.com/JDAI-CV/dabnn/wiki/Train,-export-and-convert-a-dabnn-model) for the further information. -After conversion, the generated dabnn model can be deployed on armv8 devices. For Android developer, we have provided Android AAR package and published it on [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion), for the usage please check out [example project](https://github.com/JDAI-CV/dabnn-example). +After conversion, the generated dabnn model can be deployed on ARM devices (e.g., mobile phones and embedded devices). For Android developer, we have provided Android AAR package and published it on [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion), for the usage please check out [example project](https://github.com/JDAI-CV/dabnn-example). ## Pretrained Models diff --git a/README_CN.md b/README_CN.md index b93dca6..7a31187 100644 --- a/README_CN.md +++ b/README_CN.md @@ -18,7 +18,7 @@ QQ 群:1021964010, 入群答案: nndab 然而,想发挥出位运算的高效率,就需要用位运算对卷积进行重新实现。一直以来,始终没有人针对二值网络推出一个高度优化的 inference 框架,这让二值网络令人遗憾的失去了可以部署在现有通用设备上这个巨大的优势。 -为了填补这个巨大的空白,我们推出了 dabnn,一个用 armv8 汇编重写了卷积,高度优化的二值网络 inference 框架。实验显示 dabnn 相对于现有的二值网络和浮点网络 inference 框架均能带来极大的加速。在运行单个二值卷积时,我们的速度是 [BMXNet](https://github.com/hpi-xnor/BMXNet) (除 dabnn 外唯一一个二值网络 inference 框架) 的 **800%~2400%**,在运行二值化的 ResNet-18 时,我们的速度是 BMXNet 的约 **700%**。我们希望 dabnn 的开源可以成为二值网络部署在终端设备的关键一步,也可以有助于使这一领域的爱好者了解二值网络在真实设备上的表现。 +为了填补这个巨大的空白,我们推出了 dabnn,一个用 ARM 汇编重写了卷积,高度优化的二值网络 inference 框架。实验显示 dabnn 相对于现有的二值网络和浮点网络 inference 框架均能带来极大的加速。在运行单个二值卷积时,我们的速度是 [BMXNet](https://github.com/hpi-xnor/BMXNet) (除 dabnn 外唯一一个二值网络 inference 框架) 的 **800%~2400%**,在运行二值化的 ResNet-18 时,我们的速度是 BMXNet 的约 **700%**。我们希望 dabnn 的开源可以成为二值网络部署在终端设备的关键一步,也可以有助于使这一领域的爱好者了解二值网络在真实设备上的表现。 ## 速度 @@ -52,7 +52,7 @@ dabnn_bireal18_imagenet_stem 43279353 ns 41533009 ns 14 <--- 注意:因为二值卷积是一种自定义操作,所以 ONNX 模型是否与 dabnn 兼容极大程度上依赖于训练代码中二值卷积的实现,在 [wiki](https://github.com/JDAI-CV/dabnn/wiki/Train,-export-and-convert-a-dabnn-model) 中有详细的进一步描述。 -转换完成后得到的 dabnn 模型就可以在 armv8 设备上使用。对 Android 开发者我们已经把 Android AAR 包上传到了 [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion),使用方法请看[示例工程](https://github.com/JDAI-CV/dabnn-example)。 +转换完成后得到的 dabnn 模型就可以在 ARM 设备(例如手机和嵌入式设备)上使用。对 Android 开发者我们已经把 Android AAR 包上传到了 [jcenter](https://bintray.com/daquexian566/maven/dabnn/_latestVersion),使用方法请看[示例工程](https://github.com/JDAI-CV/dabnn-example)。 ## 预训练模型 From 463c1e43fe9b2399942f8fe393684aad5e34fd97 Mon Sep 17 00:00:00 2001 From: daquexian Date: Sat, 1 Jun 2019 19:14:06 +0800 Subject: [PATCH 24/24] Update imgs --- images/comparison_cn.png | Bin 61850 -> 62857 bytes images/comparison_en.png | Bin 61610 -> 61390 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/comparison_cn.png b/images/comparison_cn.png index 00df92d00709081686fbabd1a187e5af7f9e6add..415e4b4c8eb3dce3f3e01590f39a80d80d43971a 100644 GIT binary patch literal 62857 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 literal 61850 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

$&c4Rkuxmz- z_#Ab*kq5AY2aEKU`V`C4s59{^WSd7%-cK;C<$v&l?F!p#4D$ANPfpb!?BdI)bt}2* zJs+c{b$(nY{*+FquTNBnR^uzFHj;mJ=E?2bw|RE3atS_6u0({W#sAO{t0VH0ho1qj|C=`Kq8%?6w z(lOPxf5-s(w%p-0cl6kQ{`lIpYqvO-hn+uxy7UUVNTIM;+f663dpR}=7* z&Dq(x#TJ#v=itR#l+Lnn`G|8bZc)N7yuZb+8XrtnIaYXHe!dh2#sdX5UNAgM)*m|E}Nr@ERKO zmPY#INVhT29c?x_r)X%)0kvT8hwaCTuzC*zp1LxL3cpvqxQbhdNkuPT$JBuzW}9EV zdNpEd5d*`!?%NB~d>6#8tL2fn60jW|%S=dEID55WaFz4QxvBolNK_O;HVDn>C_Pi$ zg?UbM{fzf8<>6&vTiH9YJ_n-#ydan9G;`RjL1gbayTR`+lmeC@xt57{d#>EgMX_+V zo^#o_Zxa*K6;AolGz@pv5w9;%w0rBA8DB`%tsBbgCkls2BCq$E z$=>8fPS4l4g}du_?-IMN0v1{cWbZ0!LTka)W>48BH40)Gm)4qPMz7q+8iosFS9$$B zxT?Q4p^5<(kw(uZM(PX-CxJyMZN~_>M)TJaT-+9&+#rX7%~?d)P&J>#$&+LO(k>b7vg&WB zZ+;7G2%1S&&q(Lj(;%kzA3l6a!3JY-@M{MWtllO-KYrqb;_C~?9H)AdS8B-`zWSVS z^OPT!iR69%yu=|K@2=UX>DGNJA%yH9%mKMK zKpyvd_wJ#tzG`%uDm481N@fQ&&f&|SjE5xwCsw){@cXvh*;f44ek3Beilw}HG=VA^ zsT57HLQB=hk0;0?b?YvVG$?7%J#@J=m}*q@`bArjzwtl!o;-QNHW>pbtONpyvh(qw zCE#*-l4)%s8XQ{1mpy_mt2;90W*ubwh54#mf)%k4F}wRv?-WoOsEW*x3OrI%Q_a)N z8pUSN8o47+l5r1O826JWPoIuNp(acX-IonOwY=(|=~F=0v4Ac{fb&2QUYVKBK3*H7 zR~s7}kMz~6V?IfxYOwD<02nDL=QCPld+qY;viv7|?*)iCMywN`K3F&-8TaD6)TC4q z@2B*a!M7g18NmDaM;N5o^ao^2wC!-5>Ql#7*B;P#b1-k_ zY`*6K z+JzCw=0JlqkQDF(NTq=0V!-7Z!jcFC-$fvK?B$fG)3-l9b{uWtD-z z9MI0tz(%H)%%B99S0@;>e*ZrF;i^7>M|QwL^VzA!xmR!6f`2a^FFe8x(J0is9pTKlnPZv6At zy!c3ccK9;w(xpqfdU_ts4l=Cno?MzfQKDLCjji3?zCIh=dr|xL@0X;3d(Apq)otwr zjG3OE#?IP?g<00DcJ=D(L*UmvuS3vENJl_b;pC6^3Pw+jK)(r}G*g8%LW)7=^x%VK z>zGX9K5JT8C4wvK85>8g-6f3XdP?o}g`4XSeM-63>*MF=w_(>yv&IYyD=P&|;|5bK z-vHZ$OZ;XHQCI`gwELSm^y6G+=9>)Y4um5`VA2Tf%nWoZZf$Mt^r^m7Mn0pbAZ$a2 z`=u#)d;FeU$~23KiQ!Hw);$!i5H9!DaVjZBE1iA$^5vu*g9$3#S+yDOcS<&pz~+q`R6 zG}*1dqrw*7|0Ta2m60*tyxO!OO?4ydna60>Ko=pvrQML00D!%iL~I{Nh+2YI^4auh zIF5h2M^;Wvk|_u7Z3Y_MTcEgs#j}uE5>YvDYtq8~tuogg0vmSi zwQT#m#UX<7>FZbCk{MH)Mbo=KTz3k|;l{galVe}W2F3stN!|BnO9B$}V3U`?xU0Rn z`r_`I9j^f8S;u3rKaAHqK^G!`;f%#JND&aTG^+l;HV3Zgf5v9o3}m`v#}3oFH|JI3 zb*Y2>#ia8$HxE9#%S$Vx8!Ka>)(SdRJ8J_Md3DgYrYn;=*RW9MDo@sJFkIQ|y&-wM zgIu$|y<}X$;awuO=eW4IxRY}g4tk#f=<)zkc}WPpw(|@f3;cUePZUAgpaW;GY2#f> zaJ7d`YYxv07I4=j7(9xKic&z)T(e8~u*?(#{Yt$Wuy7eba-#i+(VaVY^1xky4i43P zFYuC`ot^a&G!KFd_!7g$jzNP?>NndzH_KhF6PgYFiWd;ZQk4ZvJqLP32h3h_Vgm;U zhwFA;i8YLe&!M<~@9Yfc&YYG*SuY2Ej=+N5W-9A19D;4ES~u4-B3N7`f){wUXYbw? z$3`wtG;EgKni@5zu?lEd<)|=xSL&*&)LD5TJxYzHO6FsFXm$5;v$G{o>jc~~C)#`| zUbh~&xIB3}J>yN=C?*EoMXu(HDC<&M+ z^@9n0X3e&PM;9;qQ!?H&c=BI&6e2PRI@u4Y@tT(kl<-&FC8{#kU1jH?X3}~p8yd9G zl|Z8Kb16WgZ1toAf8%!L(T}aCMomfEB29F-^J{siY~a?S4*Ris8|&eY^9P`GVel)b zCx(Em_da0A{?(MR;UfKnEY*f}_g$YU+QXgXh9K27r?GJN+zYb#;Tumb^YO zn1{)E|Ni}er_KY*(H_;kWe?rIsDK}p;ferlqabHX+6zs6gEV~-Mf?jOB?}d0N6In~ z^I>bfP?cj}L$WgjM1cUTm~nk#7;1saG>84Vb?f+yD?VRhi-=H+WF6<8Mv099swBlC zK0aP9`AYp^-Q34kc58#{30S4eQXwdnCtj8p5)$eJ=wjD+bM?OG9}lLkSany(03;=@ zFu)?-$o<;ZNp>gOwNXjD68-vw1t|({Zf;~4vY14$v)HxL-q?@!T<-a1(VD;cfL59c z)VvaGt`NZ1rOTEv@=696n3|fdpQPN2j*bS`BAt#Mor3@?t84E5{+jWVQ3~O-MT-|( zqpE;D=Y9P6@ls$=S-zi8!lFfstiI>2Pf1A$2ei1{w-Lh;yViX|kJFY|Ub|JXhlim| z5W(MNHqx=Fu^Cgxt@mmre)>ar!M?$#3=EP6JqK6Je}@13uWFxp%Sdd!;l)j%oJ_Up z=Xdk>^V2mp_Px3Jmm~Oi05!w9w}!9f&6WDM@Mmo9mK{Gjvn!`_Xih(PR;ce?s1J)s*NW|( zw9X-Kpc3N7m4r}s{5C$PSAY8S2^!EzY%_b{Itj1EX;#pxh^&RSdf>>B)Q4Q{cjgNl zd7CEfrqSM7Y^1`DLpPky0C#{eK){GVcjo|Z*{&%^tGfN`wi~XlU%&nz-f`s=^On0G zK7QnV`|zjXh?jb|qYwRPyXKnAPU}=XPUsv@$w6 z4C^x-YcExtQBisJSwGwZ?&>}CxhLOq?2#UE`gtE#HPfSTS~ zb<)hagoV|3czEKIl8WBtZ^+qT@N?XLEOQX^dor9qdtpuRspE~t3Dtgocu*D$mib@# zZ<)iI&wsv3Q)Ay&c?speB3mL;wIwB7?%$_D#}J$Nz7cnD6ettwF;R(e@l0aZ!^l2g zvSeEzT)WHfZ!P8SIfAW-B7GiJXLe%wF_HgR&}l(LK}V}Ks!6;|=!l+yLFib6LvfG{ z2$&+oQi8ZpRV=Kn6&H{oZGR@H zXK7G`AX)4|-KNq40|QCDLCp+1_u}{@l(nxKW~j-8T`MaqJM3axhYB*E1t2{0JwK37 zDR?<4jCOW*osiZ_`ZMQZ&~}M=@D`wXdS=GD?elh1NZ$ZBfc2028q$5E7~k6TbGhej z>i-JKZAtCv)2EHWs)&YxHRjc2u$=d|S#Ne@VyL~~>sNWG{AB`-*Y^U8X=Yqk&72wa zUA1Zd;~uBAOd??*>xS@i32W-<>7h^q0s>$bmV;Ms+P*zJxxt=8W<)|lBEoK{4b-;` zqJ;;%p_8@HfD{RuCTn@;&M4R(m%&Ad#?w|D7z@MrGKPuiTD$WLqMQ1opb-Bxmm7s?mhzYTB z_5c^7$~|HdB}~rT2}UJo?nR$&k6_UHF8mhkE(O}R&%m2d_=AC2=3T8z2IJ`1rvc?X ze0_bhA8y}ECA#>lv;GmM9&E|0sNh$%78DjH7sM9Rh{o;3r6~tz-3q%La%kwAN6tq) z1%D+Y(kd_pEN~AT;pb43jsPnYq6?!2#_?JBJqatUL_|f)lg+fLau^%EL*7J3@Hn8Z zge^rp7nq>Xt0`3Mc*cVlZeUV&A31V_sDa?2+)-oS^W1%S4cs6==$e@Y8Xkeq2i_MB zhk`6j6bBY6Xn6^K4X-_1p>9UD1uZza(MdfcBclu8C@lj7BLWti`t_ifFQIrw+qTDQ zrB8k^cpMBHA{=#-QP|2bzUJeG|16wXKFFFxI?nUnPa~cdxMc^?wXk*Q7OheQz5_BT zLs1!llFjZsJ5B6##2H@U=GkNeL?YlI5j=uo6)77i#x589FC`pQqb5%09!8rm9>JMr17E5Gq5#rKJ_u)~aLg#S2!3 zNN??JNI#-gOUxuFL0j6PZgYr>XHs$=U-CNA4XUv0&uz~!RC#%Mop;8XoPXD2hFChx z?nt~gw}~AYNvTdVZ^5fx!PwgmiJI^%lCr3aWHaG}`S;BC!YX0PMvVZle zRdN?DT)02xCjN#<$X z^m*R=CD)Qx0rSNgiZ!Jc?GT|3O(GVDoqtIj03y5c8p(A5AVEqi6zNBCa%mWAdcT+| zhpq1}sstAaB5`Q&JI z+Sd*m%j$I>f_tg^2r@(Dj~`c4-o9lOmN&%ItEFCxHrId+Z+r1GdNduIWUHGpnv8Dc z7VHLWK{lvAc^S*&{_C1TKF0`~9%-8jWo<`~3%=mT(zI1uI1T-3Q!EW4a<2EMk5Q;l z;Ud5ec)ZK*;jq(n{OU%p7Q&piPSeKSxC4Q5nn_q8g%G61xl) zwhXEyB#OUF9O~=q>15#>On+LrW=%PI7vI&Uqg1J@{fuCmn-8cRE^#zPp&BVV(jVqL zH%nY^R6cgNLe`Mfp;{|pKPMVjaw*1WsESYjxPAA}?Lin~)`>sO`Aw>J<5i&AHs3M5 zn8*Hd^{-8^J6gXuAR4=>19Aq*C=hcLTjdPK+$&F44vc~@MnamgFo{Hk!Bd2iukZ+h z)TNP*k`rL5N{|AFOHMO)B3(i4TfCRLc==idh)GV+FSfc3zy{h6^O590to<=m@-R-x z-o@^UJbH5xTxCD(H_VYjlnT!pCJ_}{S*nehVw6hBihpPu&^*mDXO!SpvqPMX=$=YG zDF-c+h>K!iidZ(bjwF_a;#}#a?Zk!{2(=VMtqie- ziK(eb%#>Q1Z5$~Y=;6e$M_Y0grTCsRewUktjVFkCRKfHvjcyuB-;<=RC$k|-7cQn zZEJ?vS#JEih(lX=4Yf2$Cq?5Rb~2()+y2Ol--M5IrAUWQwYMGBt|jDl(T4RVj>)cJwH%96Bvo) z?C_Ng1m-QhZp`8_7|(okDTqyF#6^Katdb~%yp7m+(_#`s0(3%;iMB%ahtmDlvfT|Z zJgpeD$CV$|zy}sKIuNb*|LqQk^C`MnV?%QQ zI(TkHg%V(n7o|L0{xqLa*}49PbW*}pRaL_=SD-QB4US{=Cv!4jco2IC%jH!^irY@1 zJ<7_Jo9Y)gHM;&@ELv=^v}h1Pq&zvv!o7?(4Oj1`xhO(g@Two!Xrl`QwsTU+ULZIF z@>?X?gqD`_(D4$X9Rg#V%vp;rjD4tQX2uN_Z8L|`8Dbeh@86hiK=fhTAI~w@UUx&6 z{V@CZ=dS>9>{H|mNM4`>&TFDx!It#7*(skxdiN2Nq)@5LIL%Qwp_9iFp@oD~pfD;$ zsk~UVnceWyzw2EZ+M!Egz2`&m#0E#+uo4)T$b)mUW0{~QbVKK%HW{RbPDQKHY4`4( zu3_5wE_2l{U~ofO>gJ-Q4@GqwoaY?j)y=23Q2j}I3;PERT=c$;HdtjGcOjA3b+Z3N z+m{Bee2qX3+XaLe4C-trK zT!wjHp8Gzd+N9`Pw{DR!-@9$mtSf%!;%Af8>l5(M+jQa1HF7C zEVRdCr)FkmSg3#pv`b#H-3{rfD2iOLK%j7b4-wf{stA65LN0_Uk z)VOcQ>PE1I_Ei<5f4lO}uYb}3@JmFOJWvDWNRic@3LPA6!p<%amgc(~f2;DT z%f@T?lgopL4}o-NNRR}&>%N*RaId%Y_nZnu$<6BC3z-HZ^c0>dp_f1bI|Bb$yllUS zNL{lAGAbMW{@4n;11%=ps%pliM;op-2qYx9t19j#dIc+J9JZVm zYF!E15DS$A5->y_+}dI~5=GCC-6ot>%7dLqxg^_%R75cTg`s`Zg4gerAo-~B&)&S7 zH*5&Hy?id2Q~AlBQ!7jkRiQ2rECSfmiLfdGD5O21j_)u<-%12ITQasrE#rC$iH>6i zTk23n6f&;ck#+{q+&`)H6f~AzEuqsKjNB641 z@Ia>aHY7wWAD&G$eG`|4U_%P9dpGGtKYl2AMab=n40FgCD7I|qkulzAdCqkfUBF_LkWh6dPvyN+B7 z)6R54@$x_@Hs+D|tP0vcPtD;gbt>SyUqK7X;&e`96%&XFb|-Ml^NjZ)GIh|GvmIfs zm7w}TBXUNbD-!WK!o?9^zL=A9&3AM3(*1c($ert_b^qh3=pg@k`7gb<$#p&UKI$$u z%w?q4NWOM*te+dV_EH871lYCScIrzMTyC@n-Vcur^dNfi>VN(MrqtTk#|2FgKxO}X zMv`WNVrB#(iYUTC^eZqH0sV=<0T%NdnP_cvs#0)7N)}g2C6X-FwYA+O)eWwl^)R-b z6p*E>Hc4LXO!Df5Q|lw<_!jZa_5D838A;hDIsIx!V2w!F(j=A(_i*%3fm6tWVMCBj z!?w-r3g^IEpYA=qmd~_C0a~7qkfnawHCzhTR3t#oezt3}LBM5^=;JP<^&oQT*w(_= z$6vFa_1h02W@|W!=M(i5c$!kv78#o%hr1`k&4=V4?*1I63!hS`a-h2&XsOsiRJcM4 zxChwjzJ|`k+XZ1lzPosC*m-jJGKpe>aJktWKz5VWJ+B!ST*ao5#wb-@=#-SX5tx7ImyYmZnX0$i2K?M5tKn;RbN(g%q3xRSOAeV#yp(J=4Hj;XZ zh2eoa2EG!@6UHos!fP}H!hqF&Ev*}JGI6wtvV>W0kq?pD>@R4(=Z@^I)JAD2GjVf8 z;?Y>FcyY~J@1@lYzDUMR%|Z|Fz{Z@vLWf^8B6nNnCvAx?dO6R8@0*rDcw}~agTsKy zh-U}ci|DS{F}yYCZ?ae6H&k=X$~H+B*ou5z42%0ob358mC}q2Jl3uVE&uzj~ zfwAO3OJ-lN^D_OHdEG4V@g+L1J$A^%V zEP{vx-hEGpa90|O9o8RU&*tYkOA zv_*77sHC+J1t1J=`n)D9|LS2D9g*4y$UFopKxN(#9S%{_=<6%jiWp5}^9)$rkn4#? zJv=wtI0sEq$@`GrVGyjBt_a3m>#GaLS*86*vZKN12K`Y;!~NHUBZyh&tYyVjZ9 z(a}Mvr33@Z4Gs-Gun{|SNDk2_5*i|iXP4mBcg>S14g`nPr`gFLJ9doJbgPE|8AQhW zi6G=OTDm{zo|QRySGfkoVE(WhQS;4)4F>oRL33yjKFGf(P9?7`Wz{w2)HpsAkT|o z5o#P!?i{n6UG_^L_;Htb84%0D0L*eLD+M%x`gM{x6j?V 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 XtVQSK8aXh9w^F|Q!E)oW@T@-pWB9rV diff --git a/images/comparison_en.png b/images/comparison_en.png index 2983a5f57eee521386296bcf88a1f1f038cb3f0f..422a73e0a39032fcbbea53cea5c18c7143f2813f 100644 GIT binary patch literal 61390 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 ADF6Tf literal 61610 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