From 250a390ed1490d17e805dd696c23a0eee27c2f9e Mon Sep 17 00:00:00 2001 From: xuwenlong Date: Tue, 11 Jul 2023 15:13:07 +0800 Subject: [PATCH 1/4] add oneDNN Signed-off-by: xuwenlong --- thirdparty/oneDNN/HPKBUILD | 74 +++++++++++++++++ thirdparty/oneDNN/OAT.xml | 20 +++++ thirdparty/oneDNN/README.OpenSource | 11 +++ thirdparty/oneDNN/README_zh.md | 12 +++ thirdparty/oneDNN/SHA512SUM | 1 + thirdparty/oneDNN/docs/hap_integrate.md | 91 +++++++++++++++++++++ thirdparty/oneDNN/docs/pic/oneDNN_js.png | Bin 0 -> 10080 bytes thirdparty/oneDNN/docs/pic/oneDNN_test.png | Bin 0 -> 32925 bytes thirdparty/oneDNN/oneDNN_oh_pkg.patch | 31 +++++++ 9 files changed, 240 insertions(+) create mode 100644 thirdparty/oneDNN/HPKBUILD create mode 100644 thirdparty/oneDNN/OAT.xml create mode 100644 thirdparty/oneDNN/README.OpenSource create mode 100644 thirdparty/oneDNN/README_zh.md create mode 100644 thirdparty/oneDNN/SHA512SUM create mode 100644 thirdparty/oneDNN/docs/hap_integrate.md create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_js.png create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_test.png create mode 100644 thirdparty/oneDNN/oneDNN_oh_pkg.patch diff --git a/thirdparty/oneDNN/HPKBUILD b/thirdparty/oneDNN/HPKBUILD new file mode 100644 index 00000000..569fd923 --- /dev/null +++ b/thirdparty/oneDNN/HPKBUILD @@ -0,0 +1,74 @@ +# Contributor: 城meto +# Maintainer: 城meto + +pkgname=oneDNN +pkgver=v3.2 +pkgrel=0 +pkgdesc="oneDNN is an open-source cross-platform performance library of basic building blocks for deep learning applications." +url="https://github.com/oneapi-src/oneDNN" +archs=("arm64-v8a") +license=("Apache-2.0 license") +depends=("openmp") +makedepends=() +source="https://github.com/oneapi-src/$pkgname/archive/refs/tags/$pkgver.tar.gz" + +autounpack=true +downloadpackage=true +patchflag=true + +builddir=$pkgname-${pkgver:1} +packagename=$pkgname-$pkgver.tar.gz + +source envset.sh + +prepare() { + mkdir -p $builddir/$ARCH-build + + # 1.平台差异无法使用同样的方式获取cpu cache信息 + # 2.cmake 文件没有做OHOS兼容 + if [ $patchflag == true ];then + cd $builddir + patch -p1 < `pwd`/../oneDNN_oh_pkg.patch + patchflag=false + cd $OLDPWD + fi + if [ $ARCH == "arm64-v8a" ];then + setarm64ENV + host=aarch64-linux + else + echo "${ARCH} not support" + fi +} + +build() { + cd $builddir + # 需要配置openmp 的动态库路径,否则无法找到路径 + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \ + -DDNNL_BUILD_TESTS=ON \ + -DCMAKE_C_FLAGS="${CFLAGS} -I${LYCIUM_ROOT}/usr/openmp/${ARCH}/include" \ + -DCMAKE_CXX_FLAGS="${CXXFLAGS} -I${LYCIUM_ROOT}/usr/openmp/${ARCH}/include" \ + -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS} -L${LYCIUM_ROOT}/usr/openmp/${ARCH}/lib" \ + -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS} -L${LYCIUM_ROOT}/usr/openmp/${ARCH}/lib" \ + -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1 + make -j4 -C $ARCH-build VERBOSE=1 >> `pwd`/$ARCH-build/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir + make -C $ARCH-build install VERBOSE=1 >> `pwd`/$ARCH-build/build.log 2>&1 + cd $OLDPWD +} + +check() { + echo "The test must be on an OpenHarmony device!" + # real test + # ctest +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packagename +} \ No newline at end of file diff --git a/thirdparty/oneDNN/OAT.xml b/thirdparty/oneDNN/OAT.xml new file mode 100644 index 00000000..96937ea0 --- /dev/null +++ b/thirdparty/oneDNN/OAT.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/oneDNN/README.OpenSource b/thirdparty/oneDNN/README.OpenSource new file mode 100644 index 00000000..f0c6a1dc --- /dev/null +++ b/thirdparty/oneDNN/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "oneDNN", + "License": "Apache-2.0 license", + "License File": "LICENSE", + "Version Number": "v3.2", + "Owner": "myxuan475@126.com", + "Upstream URL": "https://github.com/oneapi-src/oneDNN/archive/refs/tags/v3.2.tar.gz", + "Description": "oneDNN is an open-source cross-platform performance library of basic building blocks for deep learning applications." + } +] \ No newline at end of file diff --git a/thirdparty/oneDNN/README_zh.md b/thirdparty/oneDNN/README_zh.md new file mode 100644 index 00000000..da3e3d27 --- /dev/null +++ b/thirdparty/oneDNN/README_zh.md @@ -0,0 +1,12 @@ +# oneDNN三方库说明 +## 功能简介 +oneDNN是为深度学习应用开发的一块跨平台开源库。 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:v3.2 +- 当前适配的功能:提供数据的序列化框架 +- [Apache License](https://github.com/oneapi-src/oneDNN/tree/v3.2/LICENSE) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) \ No newline at end of file diff --git a/thirdparty/oneDNN/SHA512SUM b/thirdparty/oneDNN/SHA512SUM new file mode 100644 index 00000000..6e8db932 --- /dev/null +++ b/thirdparty/oneDNN/SHA512SUM @@ -0,0 +1 @@ +6777927537370759e0d2043bee3fbbe39cb26414ae9e2155bf0978471b7615f7eede13c9622c335343e4ad1aba56b4d3534a151688b6f2c11731da8c54157f41 oneDNN-v3.2.tar.gz diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md new file mode 100644 index 00000000..b26974b5 --- /dev/null +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -0,0 +1,91 @@ +# oneDNN集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/oneDNN #三方库avrocpp的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── oneDNN_oh_pkg.patch #PATCH 文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将oneDNN拷贝至tools/main目录下 + + ```shell + cd tpc_c_cplusplus + cp -rf thirdparty/oneDNN tools/main + ``` + + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + + ```shell + cd tools + ./build.sh oneDNN openmp + ``` + +- 三方库头文件及生成的库 + + 在tools目录下会生成usr目录,该目录下存在已编译完成64位三方库 + + ```shell + oneDNN/arm64-v8a + ``` +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示: + ![thirdparty_install_dir](pic/oneDNN_js.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + + ```shell + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so) + + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/include) + + #将动态库打包到libs + add_custom_command(TARGET entry POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so + ${CMAKE_CURRENT_BINARY_DIR}/../../../../libs/${OHOS_ARCH}) + ``` + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录,执行如下命令ctest(arm64-v8a-build为构建64位的目录) + +![oneDNN_test](pic/oneDNN_test.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_js.png b/thirdparty/oneDNN/docs/pic/oneDNN_js.png new file mode 100755 index 0000000000000000000000000000000000000000..8d27e4b5b7757cec7257b3c0a0fb4c3e10b2872f GIT binary patch literal 10080 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 literal 0 HcmV?d00001 diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_test.png b/thirdparty/oneDNN/docs/pic/oneDNN_test.png new file mode 100755 index 0000000000000000000000000000000000000000..d704ff1d8cb3c7e1e76d3cfa3058bf39132f2eaf GIT binary patch literal 32925 zcmb@ud0diN|2Iz4tasCNH%&RI=}fjwi{52!DKb+kl{Jn{YKqE~Td9cq4meATxiDI4 zrNN}rR4S4S;D$7nk}E?hsHl{vs7Qne$m;K)voH7aeZJ4{k6r-+*L887bKal#@;RBG zeF|UwFXMkfAduBZ4!fLyKvqUVAg^S;`8s%onP1)q{#y}u0)7xu)nhshp1d0N$?;Dh zkZSxY?djLR^S7c8`^G^a?>sX6Tfs!%4TeB6_8oEg#YH#ESLgSAg2Z@d}*eQ{I6`LNJn7oQONouZ;5u2RCs#U$bu9+|f+ zOjzMk(&jzUykqV%d|%_lUeg3jZk4h=k`Z~VFK_}kuUY|tRL!UqeD~DHtDG9{7p!K| zlp+~h_yz=G|8=MKo8xtQtMvGF0?m-K?If=Z3svpPe>BR+DZ<$z<<=ev*G&z$|r)79wf zhcvh@{Y9n6RYnofq9!r7aCcHdrI&w*Y8TdDerkXk&bWilnqSvnPe}JPCn5*1&V=qO z6vUq&&yT+X&b_Hqcl3Mz2kk!?CDXO%zi3kwW2)~Oedj&{D;*TY#p@}1H4c@W%xtJ?psRSBM*Cz#wbUDCc++kIW8pb5stLcn>DIM`vc0kkw~M+`$ZAx2dx=HR z_@ujq}%ekaoi>S_ngZ`Nko~PI^?lo->$uu2u#QDy^UFILz?I!SJVe%r-L&7L2`$ zRCPbzE)v)HV6{orarB#&cUOZ`tk1v0*UpTHB#Vz%n<&=lf?J;!@8e4X?IP%MFdiVa z0WbKcSAqu_74@@3Ik-)bjM_B442i23_xR{`ZUiqtK2T2LbLX+}!)h-+FH=3BWiO1X zps=2q?ij1Y0IjjyjA4E;;vAHrHXfW)8Ah7v#TFs7XN7=6fFT4r*<;ztF8Q=$ z{U3fP|J(lJy~d7nr(95Lc~(5w<`yP(&Zpee7sIySiYZTC(|$Tm6~i|5jp`0jX&)-2(zDG%&5pl3 z*=(}rnV+BVRj->Sk^Uh9uU%&S0@sAuPr|ci#3XdQ_HfkJAgAI-%rY&NHKl#P#waBB zr&qPe&!FiWYpz-Qr#Z}(B^|ZW`#-r}6s?n~8Ri*BZ zL{Rv>G*@+IxW7lsT|CPw5@ybtY#$>1`EhFO3VRr45kZRk#4sUAf;0pIDM>!Ju8bKl zA-T>-eY<3&7@65;R3BLbyE56gC)EPwu=uWL4&uO&l$;=u^NOLPdkBxhq2^$Ca<@uw zO}>g4NeWZ=vfSSJ4y!vmZt;n_Gra}IGOwEKU0sa(k(Ju(oBz3;#7ySy+~j)zxdG`e z8yrr2XOOR6;65EnsHFzNi2SO8nwUWd1pf(3!wx$nSM|wMUaeB=09Ifn?6WkzWKqZ9 zCvvaYdB)c`{p(&gx)9&(^wE_64TO^A5s3HUS=l9eZnX2r;rZg zn!McRSYHUQ=&qB|P<|E;grw2n*p8h!Zgtli^xF zQiFBkv3b?~E!(4mJr;X$dKP(+iPMo`(3e)xix;v-Aw%#pQ1lnwYvrU#@_@8Vg*g^1 zqvhUmZJU0-iR>rOBp4TQLPH$<#uWPmOaZ^*&nv}<2 zAy-Vvd}tdvuELM(RFnU#mRW|yH zNNd3B*K$k@YbV71uHE80CWc4P?CY0Tm#-W9$S!Vtn*+Vdta8a&v3!%|aFG*hFs_39 zrs)8ZEbUj>)(e0pMHLasaC@~AN2eK)(k zEo5;}Pz!X1dxf#tA+jYry$>!rwU1Ub;qB#rmPpVR?1XzG_kVhXxO4PS?0`Ske?Pns z5$Eg7xQ|J9GM1>Ek1juPo69=;4*3rFsUGwP%v?A=bv`KZR#CvKYQ!v(&PB|AB z%;~w(KIhH!YxOE*j4{3N=TQ}kG&S`w%ri&SZX}ng&WnYDK_}m)_2989hg<;bSa)v@ zT$9t~B^(?FICz0R+j=^pQf#OB>V(ya3N}u7f|BY8UuHjsm{bm zvU~%~n|z(A3Ww@hnFZo;8$uV2gObnFk%ljZ$4@if^=-G@95!;ctHYu+Yj6jnZlnUc zJbfGzr_r>I!}^W0=`}Ff1c3R~4r&Nsj&B-Vr9+}w;!(-b_JaXe_j|1iIWBxMieX$#H6xtzX}Xus zA9$*f@9wTTx&RG5aJDJM12>H*sx;LD_Z_tKOY_g@_uhCqu^ynMy4K)vI*hPwYx3)CZ34yosBa-%%*IrKZ zeaACL9$!-Mznv@@qO6|RTDl2em&z{WR75t1x0a0 z8aLqV9uCQ!?Ot8{lTo_-Oc8d_NY*CoVd{mSARnY!zo8R z9QCge>Ca2;+^ja7C5+FV}3--Si_;+~OS zFy6hl-6dlFc(?|xdeP0b4sXA9yHtL8vWV)N;FS`&Toe!7W{m8#P=(!>wd=dMG&5Z1 zsEoX}-*F#t9wp!YX~{yO)FN}HG8`EjN!klX?84~_F=;IYOwx@CY2bRLUtHMi`$*!c z{B`y<%N%Hu?Bb_iy@~Dot|aB_aKc@5gx)MsdlqZHZcs}KI-3`BpzTEkTkTR9RA;-Z zbFUxL`_X@|r*r?q@R=aDts+{K32OC^GgpoA9@D;$%i?IMZb)+Xt;njKmgz)qr}F1- z*4#*qK*?oH*uz{e-<dV-W%e>UDi4pRtYyn?mkLR#E#U7jlg(cEY!*K__Qs|^3u85n^fV+6yDj9BBcpi;c ztA>4vJ8)L8i$1N~ju~<;#V`|F@fBvPc-~^=yqMh!o3TJWq~d!3WyugV43k|tUaN{s zT`}B=+z}SZ7&Pil{c^ONaoN0mR^D)cvkDwyRJN$%E()n>d)%YKzh{i@A1Nl%%5m*d z(rr;$@ojmql#-5Z^6qF0F|eDS7b?D1w20wBX%wTWeSuN0l$v~LVgGRTr7HZ$Zu4T_ zS`0QgYaqG89K1Pt18eaGe^g=iS>mC+BDWxX@$T!gKsj$A-vQqCq`PRIh6vfRI6A)o z-U|^;}%uxB0obIkjG=A)1}! zuQgV^lQ)mb!MEj()3o*#c1-#}f;8gfrp2f7AFCIHBTt3bgc~5vi^HFnSTISt^!7HH z=?b1E9#E}+LMFktLRS}7(PaW{M)i6I{JooN@aegIak{)2ghut$n6bq?V{ftkXmD0@ z!^CmtLy4sWW3TS3m@FGoFPNRyjVBnzxFZfuw6Y+!Mle^NB5N+7#$O%h z4=>bjOZ}==Lr>+#9f^wkT4}gSj(XNHGBxj<(t?!yp6FaH9-%_`3ATi~%9E*P=sITv z;$+x*T1|aj7H8m6Zf&W$^1lz-s>+0(ll=|7ZCl1%f;?%?|1L*Jmx!Az+-%))z%{C&aSP@;uV4#y`)Da{)`v!8Ky zGP?~DrkM2EEPu_icotrs?8cnhhKHh%`M6bpWX(9}El3^{qoSn5N+ZbQ`C1PHc<3VM z9h!IM5?xu$p@^$_a&E--Ea4g-+4O~O#~1NXtZfjR z*1%%5h)NIF$=YIyT&>b3lCI`-z79!#8-RwhNjd8dfkj@%42}*CPaXZ>>GlJ@X6O4R z4FExSFW$17q@m|VfAw@oY|uz<$SJp%YC*6NoQ9e2Q^b8@yQo?Mi|&O=WkjcXC3-~8 zQuFM-o0aG;$mH36`$8j5^j0>OJK44b_vG!J^UKpGR%DO!i_Q2a`fvOjz(R5;>W_>H z*Yc!=uFwBFT=1}qRDVS)#ys+hS+qYBx6tCHH`~{y=gzbvThDh}`yt)Ekn4%9J=Oy5z8QP7I(KEg!Wom)5LvAC;Lw{vteCX#UWSU=PJYcMSFM_E_&>E{OH?!Y9wax~cT z^)yx5nDG@|*?pU#p)^VxZ{Vpmv6=N;rm4T?xiUJKs4IAK8xSV>yjjL zG3C!?re04q%xH*xq0k&#FJ79+?@UbFF)%4Qouo>-E03L&(=)Ft&6Auxf^2b2_>?64 z6uB~jz$49xPEEv}i~%3cZt7Z%h|e2pjE3IGQ_CM-TQwHcK`=)d4a&;JgK<`hCqEaA z5Xi^GCjFy9_;*HSh`|GkoKwVv`E9PYxXK|jc1-!qb{<^@PUo545(B{CD&acgrD99Z zdBxsHow_MZzpJGP9IfZs2^@!!V7+eS@j?p~pQBRTMSAEjkKb2m7rzaFq7)F=-yEn!?3rc_JU znih7`6A8x(?ZU}3(ygeEx2x&Rn?NAk#d`C1P?D4JE0j=c60q%J zG^eLdzjRjDVF%s~Fb!R#AvK{!*A!#6O+R(VW&zY>t;->Y`yQYbOq}ia=?~fScjSj< zp}od-woQDj?N5FVL~6(vUCX>D>djJ2JJul&M$!j^c?!~ep2sMD(v@(Q4CgWEI= zs#{Z4?zi)sa(G(6c2s+Q69IEf8Rl8Cv(O~9@hRDGQ~{E?lUR0n<%1o#K+h6n8_8iY zYgGCaFMQ*gsMlj)esw5q*5x{dwxD%pKGCk-Bv7)>j4!}BuPL{)JmyV9#7EEc$63_? zo||u&U6EG}-}P>+C3}%Dq1{Z`L~>5c4LpI6ER=1si(cP^xrmy4%O}>gMqyKh-M5S_ zHEV28_$hlY`4#af5Wgw2+Qy>~9!Cezchv%$ybUky{jy&{^n*-Z|q zq0uaDGjRoEPrv-Fj0pl(qhzG&Mqt|MJ8vkuH_)Z!_2q3l`J7_LZJSTec%Q_FiKK3# zT8e8zRnDq&MxK?fOyB?ExG$LUALGqB>^>kFsPAa202L)OYi8iaSR%Zx2N&NuvrtQ|R13Fr3XpoK<}%d=^Cz-V@Y zwXr|w*(_mEe$fiu1YJ?H+; zpr3?g-QvB%w3v_n^sxm+p5SY$BVN*OmYxq_YbV5XFvL2|+xS zVdM2uqIr$4m;XsAT*wU#zPZG1B#V=R)d<(o&k}17FwJ683$r%->9>Tl4J3tniSVpivb!bk^TC{XJ6Fh~zZ0 zvkib36ep)4`H8eJen#q7BUi{_effJ4S8jy%dreeJx5njW=W#FpX=d|T7P2FJZ`|19 zOmjQz7SEerV)tB<&E(mL3D#l_n#G-~_lmQ@k~qT~9ox9u3&&s0on2O;G)jXk_;PCX zM*3Ux-A`q&bEMFQv^n3uP#kYed3oG9ly_m77t*VU^1a)}b^X2Np9E0@hQR7{ZAVqZ zK4<*PAUDmxz*?D);5;jjE%gN_^qMrN?Z40)l6uhQGbod9-J{H$8*+xqUJ086BGBrT zvX`&_=v~S+A{&$y|B*Tq+b=#^#PvAQKa%NQB-C;chFbbRCch9G7Hx4!NO|YNFCwA4 z?r89QK$$g$aTidW*|d}CxEZH%$ulnlmN^kRhwrzyM#Zm4FU%S(*IRGuEW08+Iv|W_ zmvzPgR+Vv4Q*fAmZM1`0(7Uq`h1`6&c6>G^VmMV?MsvMLHEfp>HLGO;Ivpk3d7S{7n+X*W%Q*hdq_owTWoogXKkbf{66#vE0j zl$w<>x9ci~p%`#V(WoL#(!l&f2e1}feuYWvV+niIE~+$@!&O$(GD^`j?qrjx=z?2O*3{ z)bR^$YDq%%tT5ojA}1abUt2c{YBrWR6mDzD%L`$V>s*IkQf}z$d6uKp}X*Ys4j`B?q!wQHtJw88kUj_m}+N{Hn~|%BM?y zm9zOe>xip+J)tDy{h_?u-96?xnPWG031n}=w%u@d6}Z}1fiJBR$KtlW%iUtPpS}9u zcKg9A^)+{rfDVRTc==rM?|R1U9rvT?4nNqfp%ZAskN+T2`^_(8C(8dD0li3fOtI)RNxd-p{r%SV zGs~hI^r5<46g4R_fkc}j{L^NSz_@+=xohmdJ{~ooEjBUdx>!9E>mw19ZSOljgFw;* zvN!A*td>VVpd*{Cw8uXdz50xK85mIZGyJkY0S|QytB;Hl7qwbDGcL{4{>7$cPDzg} z?o9G9htxMt`A-4Ju|I$w`W@sP^eW!2gNOI(6A4ob6x4pk{f2_>=K@c?H|D|MvePum z7|@yg1oNhgNhvN@%b0(Fo6;LeOM;r8jaN*;1o?M(Q?7s4$g78)vf^3!eDk?MSs4uJ zy^J(AFdti5T^75s6u4s%bMS^b(&em~z0rwiFiDWlYT8>SkPDu~4PtUJYkM7LztX$Z znAUdyi|q8|+%*uN*9T=0(;^^s4JJO$O(Mdp_%gS91 z`L@@9GV{NnjCH#+t}x#}aRe@d4XIbU$1k$;2zHm|tI>%T0HuF z^L01=e-x|hgSC+@1W)(2u6z=)j#XaK5hQS*G~H;y+^G|LZ)|7S-Rp-DE#y8C2TSZ@ z#;#L-C!eK}3%X#jn5{a5jYuf*E*z%@m8z+gMgxz+a9f{-2Yl>SO<4EMt;$opytV_6$zJ+o=elo6Doo&=r^FH8F?rU)JVhAv8u-((F* zo}r*vl)?AuO1drqs1h2#BDFB9hoBYB+3%I!VSw*a)VIr#WxN3q-g|PGvP}=_9`z+@3=;1LuDn7J2Ut*;GkMr z&{QoVSJHkv;%)Hz36kq!B6NsRb(vAeb>Eb47!cNBVp>0XX(*R5mz*F9rzhbXsXkOp z5P>6P4BXZ~kF?U9`%=+u`I)#oZ{!!SaS@=1-s$mCyE@tBET+rf%ef0q5Am6kC*Y=5 z=>`dQm>Uu`5RHmGw00yT`VauZj9oxHYwE-{md*cADPLE*=TDMs-=RhJTJS-Lea&(7 zKsj>j5=jA^i7?IoW5yVs2R|bhRc;rpI}S+iv@wRjSDt24p?zqo!}rzs6q{< zYKOFt{}jWlKI-v6%S#v(Rz5`_TRFhJV`7_9>x%xE7itdIkvOM3p&R;5I~1J?{F(2) z`QCD7jNFN_2Z2Wxn?tCvRN0ljZ7;l#EcF1hECOiLV-QXnsG%k3CX~LLrpVbL*eZP6 zcMqaucWA#;xI!I9b#9>pbi-r zRkIdy|21c1hS=cdU<8AhTX=Ez$BJ$8AXkrKjHz70{!`om5rf&i=!I?mDfzvK>XZW3 zbIr*=haSiTb>wkpB}YIy+sy5K141plDTyqGF1iZ$nD`7P_g{v~lRY;f@>B`VO;+>O zq?kIYH;%c+07^)yMA{AknvpQ@7p(pX;$T_Unx4SpxansyYC^cR@_(|<(Nv| z?U(YK2$UXgNu+)Oj^x)evk1}yYapiQ2~7sdLx?MT2`CSCf4}h2kl@~2)=uX$-v^Sq zjW+^Q{SNLT(Bi`A)4SX66(`|UTZw<*J7|nH;+(kA7eOYn(A=Yg^^wYxn;1@1n+P05 zp3K7gJPj4D$guuN78tKD@4-Wbteq{}?=j72W~|+1D!_j9iL!G0=!DM~pGT&w8?=+N z52LWZksjQ(Wia}U?jWRbc(cVqL0asz@yZ9+ry42}^iK`uj{TCkliqStJ5-~8fEclh zoSQtQ`Jqk_f|J;l0M0Wcf1ll?e;W2%A_9svX>zd~#g3E6=cWWTgCJBmXY_;Kyfow7^@H zcY1=vNiV5p3|m8yJqe_{V*f}tqwm5RrYdJ(8Y#4q!s2rT+)1z&KCm^oITK5;1azu- zU#?*Zt}k6CI&X|$xKzA3S^GU$XrGlVvz+~nnVHz|+mT%$Xb190TP}7N<&e*uX&)y1 z<9uy#=KIWN`y6PS!<^hdx~$8g0zf>hH;V&Sd4O)RhFWJ&eIPdX$&iCz&2WFU_aCdh zJ)Vrp7mZR5^CEJw$|#bd~<`>;&sdKSto?vTB#DO zb7caZwlu7{$Djo20u+vsbR$aPJYRICpVjoep7f`99yP5z7iq@3LBWy3(`^_<-Bzf? zB`6c^vy1G1E!@@WWW%ZM=_Lk4VP%F8%?CHzj?U25!<1bD3Ht`)&W3;>@bj56mxZ}Y zHxq6_{~*jwt-fTiD7iPF+_NndS!Xh?HjyO$*b*llLb@Xopl~ z(uYED77s81FUT%qH^wh)Zd~#Ff`Qfe09!DzNEZ*EKJF{p?t+;4Q@G}$zRUu=4H6w( zJbK@Yanul5g*>6F3Z8J1zNslD&uSc>@|lsjXZ<7eg_XAKpOGni6D~0u?&v)3$3o+m z>z!KZpdG$y;s)i4>EOaf)r!Y}`naMGf&~z2Zi3nEr`q##JP$r*PyJ;$W{^t6+AWk! zi~cZfMElV6-psSJ0Op1oK}pF_aaukMsf4bm%^qC3Hs%rZjjoQBOB8Ji8A_AA_i1Lv$HMS%b7b2 z@dBT?;J-LLK3>OyrP+V)@AQ98B(-yen#%;~QRb-@{N=VZz~jG&7*zF82W80k(VCco z93N8hNxV^i^&9v0lqVg*&>P%j?l@MiQo4gCw%%tK{W=jS)9SC#^Z^9=@$N}pZA$7S zdio}EUEscE&GVnElwmS_wC#;yM zzK=pMmA17lqy84E3Mo`o!F(_X?%-j}mz~=*dAHH881Uv04q-oYbO1>m0OJzO@*jWdh zcg$|4dL`u^F5YF-1>Q1n<@Z!)@mO6V$O75M>E?g7f2d=^7UjjG5qg4Oe9nqz$9~b% z#(aAAY3+59f6Ve+uDzpU#aKU1$4GBBo#vI<2`sfHTFVREzB=!_kwc8Q9pMlSe z)N}UMJ+a>ur1YwAUY}E2xE!fd{Wpu2?O&J!kE6AbLD0@BJvW=&Z}F-BzZs$F?gwaR zyU`Kz@*&fX$?~y>%5$w{#x$F~Bb)0M(IgBy)XA!0Alvd| zRxI1MAEywc#YYeszcC)1yw!&`!u-JK7GlWY1sQa^XZDu5O;oscI%D|XF`vJRCtd~6 zR?@o^4!8y)acpwNN57NMR8o+H+vGl}C{>YmT1L`GXN_xrR?sfz;=`pV>NcWddC+9? zE@O#&9(>gUDgi6w6><5CFAgleQyf^A8+iBkF}P%}bW){$=2Qhpv-)W34HKpx>%lL) zi{xxe)r>|o8|8o${sSF!QM86e&-ym&7%+Y6is<&JCDZ4p8P`~E+4p}7Y^-31?uP_U2`>|Ap9 zFLf6lL=e|?{%re5?xu^&L|kM36?g9Y;AdpUEJxtZ zz^$%Y*Un{s>mc!B4aoRn zc6Kn9c+U+`5B)9g2|w3uQQB}7{}xP0XRaaw%z`Kr?!iQOQNGFLsn@?TF?2lmZ?uaX z2vGEH0&xNo@!zO>G-vSY7q(FY;6KQ-@66PAgL4IWkcUcrShr;X|#TB~q*tsV4`37;VeFYHLJfahE)ID*6=42Sa*pl8bP}i(-Y$E@!+#FXX zoU&kxxWd}hzc;RVeU36!4SB$+k=;bq3K>()A%dMIWIyR$Gpq8TUHce4VaoH)RGZws zNm=IIP?}U3g2}G@`9K^hN9BEpfgX_tx`(g{Zs%6mW%og(HHUL_d<-bRo z!1ZYM-p2MI^l|+j7n`Vi2lQpjse<@FOq$$-tbj%k-)1#gCCy`6Z3rKgfr=E5;u5>yjTSbf_d~$~u%Zl+a3u zj{k2I2R;#D9>Cx%5d0h4Ako`E;=3$nMC%Z<-_m4Kx|BwMF23Y4hW{sqPGngenUv6$ zyofbz{|JN7Wv<(f9a+e8N${pvIZ!#*%18xRZ0Hv6{zw5xwW>)s9M3Ran6#y&H$$gE z()BOQ_4B2mHKwp2Ng)~0s$T1}5z87BQZN2j+F zjgzVMNel+`)fcS4rq>jMj7Lkgr~QThQ{H>fo?m=`Na6p;TarXT###c3_1Nl-0U3me z(%N!9lNBF%m&otV1qHd)>E_GR7_5VcC7Y)- zVg6wM@7k0OshWKmlp1we;&ROAciC(gU5zc9rwkO(&+Z1x<_k$I2CS1KWqFh7S)SV3?u9hS$l+b28P?tS(jGPU`^@WIOLgnkhByQpzdUoyq zOnt<^^-CRE0wzzV#WB&Mlxj!GzM;!-U5tOf46&^2-7l!UN&Mb6=6m&Q>Kv0mXpPj2U9J zWtf$CKgZFIPv1tA{3o=(nbRe&1+rXOB^bwufw7^W)v95N&7KDAw|fU;x}U81P7Hn& zV6@8??5v!tG6@f6m&~9PDHdqm_IG~i_gkF*7&Ih3?0KovBXrcjH!UDmhD5_`_652)r2a{gvq5vvB<}#y z4MR)PKNWEq(5aNp8sT(v$KStq@n;3P|)Hg^0ziQzBF!BD57y)shIWsrCdOJmBuwS>o zcGEphq`!Vvyp%goPe-`Z3~p>d0W7ge4`rRN+6yVk)TKW;>u-nq)HJ8_Ldvq(cE~PL zvHJV%Pu4~-S(BoTl;AF7sA#*mcBXu8A=ND>J1?kUDIZ5fiHFMsVO>I`hlRs!bOkJC z>@nE{mVdXWT(OnOF^;RFJY{)o)hN=f@Z3KC2{Op<=1OH*TOGc%(9D9|G~47;&BC=h zW%DPs($X;fhQA?3UfpyU|vTj^hOP2-2T55+Ey2*bDyBY zo_?;}h!+tQfhGh)BDo7Vgy>*`{F>W;JXs zbtN#<=c0irC3hXI)arjYrnr3^mC&15D3{K=C1&0hRNBbQ+w+BCctOiUKTuxJ*BgwX zz`pj^lpMPN!*cXOFipcPR&e>cN5rT#tm9E9Yl`dsfK9X~3wO5Y5cU;`WzhRN(m5zBRyd3@#<$Ke&Y3e$nE;cMKqBsXX?rmFD zYB02X=H^97AfF_-7%_Z5lk?iGZ<7=Eo(0Xj&Pkl@9mvc{BScq!{zT=Zgk)uCbf|H% z5L1sU&SN4qK6o!qU}jqm=L7tC>R_^scZj&O;E=)<-CW>)67Sjvpgr1#g-n-Dpp?er zuY79TaLweo)jQTyepi+&$(MG$K^aR8ddVVTHVvE-$@g9%_LA@5K!+if@jXycbwMm{ ztx|0$wtocH18g{v+=~3S;#)oY{51VZbK|DGDtuI7Rni7zr;s0%LoG=Y$=BUT!c#;s z^M)QA#Y-(n@E8OA)hb$kFfXgMWGSkR(3G4~sPe?4FQn@G%OhGy;CC@^68ByX8ZxwA;&bF;rV5 z7>|BBSI)NdG?2>sUr)0t*HMk0{(=X(ncW1xkA}N3!A#uOR_l=N)PdGy_pC7uNPYB! zRXR!*!{%)(*Y1pv^gA-{FNK2A>L#*|?%6k=^m3rqphC^aU2yw&wpmgE zBTR2dO%Oq9B5+{t6)sA#ioTsejo{O}1HUdL$Q_DnH+@a=A+8AtQl_HR4!Tq|@V!Db z?lY3>e3&8~nnt$DkbN8X%}C`|;Tl7NVxh#@&bsHhg@`Xxy;?FNGlFS*QA(j5&)aI= z8@qVnif+&->i5|R;vsHZ)uX(#V#WJ?hQ=dFwHu;`E?2(=LKZ`E`&0}h7r07yd&p2B zAEeW#Qx#`)Uk>%b4s1r3P6emDccPdNdN5K>{M4|Y_JWxCOXCs9OElRzE_%;O+o}EP zO>DMkWwbw3xF$z5$s!xNb@PxFTbBWo#n;gQf#bJK2lHD#3}&pCR44u%o2aYf+)2{i z9#J65Is~GPHv8Q0{HWT&k{Tl2nMQCNBjT#-az|sR{A?8pH;Allai5IJ`4IFW&Ha(q z!El`|(8UgccX$5+<&RxReEp%I8Qy$Kpx#r!Hpv}dM zgtzzX`;<9=spz2Fj#_ly5_hy=j&)TUdKb?kSlSkRPK2dc!2FkqOqU+DcH+r=E=}hq zq}uQ>#x#jZk>wR;|%TEVm zpS|tebQ*E=x89@|PRUhZ`mxM(r?U-i+@xC=mVt*1|8|{w2Wo z`Qp(nhK1$}g3zi(yN0#|b`SFWXSPSq1#D#8Jc1qx1B=U)F9N*j*Y2E3mQ}nN zya16o(LtMK3vN-bcsV@owzcUVK~y})u<-^2KlNN+$tW24tgDgz zz5%jUckI}hL{?+yWrdvUIWl>49C%wsZPQXe>{#up#GiMH@UvU#t2ZN6LlY{mBSIXs zTHDdji~an{HVNaN2<`@)YqD9oifD9^W>;SFvD781?*EoS`J3;xs%TtWD`+?ekmEr? z^fHToL;lmxxtiQrRnwwK!+Vk5Pi{2a7|`zeYm4fdRK}`4*&Al1&R$sD*IW%|%WoNQ zFHxD+ex5B45ksDt&I(IgQ__dCSr2B^UyIg#VZuUcyREQ8Y`g1G>?0?JN)={aSaZC( zZt8soZbQHN&2uKc>p-gJ7_3t)3{q@Nc@M6wEKKE81|%HwGJSAhI%%NPj?yw1b}IGh zrC^)x^8QBdTOawEpW}^Pt0dtifg+;@!#FbIv7N)lYbH0zN%JyAVRc$#Drlr!8K#(jA;HSj&&_d* zy{m>tKL(9LjrU$+NV`E~+y;#wRe_Ff&~*w@e8~AzE^(xLxAG@)hkof3GJ6%72^qg9W=CMfmwJC{ts*Zb>`FOICmW+ z8XNm5tvJM7Nl;?mAzuzcScuF6tfkuL;iKsnj|V<$MBOUjGoAUWuJg7 zHR}$$KJprqyhpUAS+14yu?aj~^3%^#Unw~!(w3z|%L=p4U9WcD7i9<)ASHKiCxi;p zq1H%bKH19(keke~DziV(n|#(m#Fbed3!c&(*6lt?4bn<8q4+lj9)C)ScWFB~w1O*`|S?j;Nz3pH^d$Uee3CY!ao#88m`!Wxi=T*xT9JDbgq< z=ru)x)n7rSYQxN0f4u4R%EJ6&QsInSSMJhs3h{aPbI)gAALHG(40G$+#Xkn3?^(mO`_|0z4u&Px3s#hy{YP?+8EK|y_lQl^?o zUpW$WI5+ikgYo=D7q|>GlFwKi5kGHe&pDcSWy2qudp2w|@9*u%%UNp?mqk!xe(nR^ z;OJcJGgOO($~4Z#N{3peXIFUZ)%kO+&6ViKcy9HOCBDoUgXp_+J1HHV<^c;46ht;t z!{U5m+{ZjYeDCAQ6Lygg1D#xJR&Dz=WpH#q<4NqEn|Jaja(=@F@dV@V<4#~* zZ8JJlGyU30E8MMuYF%hx^11FtO018xtUf76d5zWcTo}=f4kB^6mj;=Rj{Hlb@@idq zs)X)bD+G7*-$lTHicP3A&Mf) zL?UKq;(Ks|1(#uwx*VB{ueF?alMU!=&{l!EptTc4)Vr9>op^(btKzA>U0Hg4~92Tr~y+tRj$O9Oaw6q68s{gVHOPsC2Gmie*j)LpM6~ zSN<};-0qxV!JEH8QhP0x6-&wOA(P6fv`zZgE9E0=rbPm4+3zf-p>RyqLHuF|Q;b|! zzkz`KA{(@+Hsjk!y0=j|O4d5on*VU`7$(OzQTlG7z>`==l8Fq^f*`NSJx*{Zumsn1 z=`XdfbUq2YsaNhM;^65F_dl|gSdraumo|S_K7|}ZzVcJx_GXgM{|b^5ERJhr-cVeN ziM$r3i2G5t$|<*u&Yg&30g$mEp8qGF0*OWv4Z}{Q-?l5fwk8>E$^Yvv3EkXj^Q^nw z9c`C5^`KL=X1M(FDsk@>Mr$r>vOrOZG}MM|n4Z~~_iFw2ZpHZRwGx>~1qqeZPQhI_ z{s#HE=}mmzXs^d$@>UbFcyQQjI6t}XoezxY=yU`tjn(<5#v*>c)IxQBUOAg=j*sOz zTLAU{+fg8~!P3|oeK`%`Z za=KGdEa%ZdmD_w3UhLDKCXrubwmv`D` zIVVNL4mAdw1R!C7)H3^rY9R6wWEY`!PbOJw4D7}l^G@O1l05~s6sSf2dvP*rG+V#g z>)ZtY>!p^XJtVml@4BB+=PGtTxwO4P?Tml;_(JG`4!@kqt6XBXuewFN3HOcs`c3qn zdw0Cn#f+u3;kT66mSfthDQ%`G()@4*2u)lx>`O$D>YGP9ggNtGiP>b2-R*Cg4&H$s zD4hq~cd{4zt}*BR?uEI!OwJp2KS&{j2z0)Nm~Zd zqT}}Lz^F>xoQTZsx)s@ck+rsaBz)ad=L6(^V{+V4ry*K;F2Q+yaoG(!kn;(gn7JjW z-TOE*iw^EXgKGp9QAXxYerD^l-l)X`Y>E~As_$_+#aloh4Z^qi#JMz}h@%Z()-KFm zKrKZo4CQJ@3by&QW)dt%AUgV`rc*B|8N-IUc{cWpM<+I%|)*s^fYK@r(#RqhKn}^66{=V=kt1@7&Fu z;8S;(InhX5@2Y^No0()jzr>X()I4h*Zx~mln>z8qO38hsJ37uWI#N3)NjQ`^E@zwc z+bB-;npx+r7XBCqxK^rx{~R@P1$#2sZGqE2GF;1lLWf`_m{()V@<#?-{;(;7Ya3i1 z>`-%!vv(hD>K^~+pgFo)P@8faD&kr*BxNx~>on8WO7CMwh~8bDYBz22rV8<#eL0)v zit$TjDyho(&us&j78BYe*o>y2e<@rHc{XGqOtY=WUB)~OcG~h*eeZT#l^ch4&fx!_ z09hdD2kpU;#5{Wt2&-D&y6?#kM)qLqzR$qceJR!7+lUG$3KPX?@z&fsOz327+=9wa z#v7;& zv^{GXnh8Sg(lq9Ai?vDf@29r8Yx0K=%6Q^Y1p$Dqe=pGDIDsFuCpSzXVylza!0RD> zOW}^Nrn83W+L_HQBDqu9a=8HXYFJdV{IJ+TaCZ|d+p5tKGj z$-8*P9%9)Yk5=JNQYxKxye|CzYwgU#nmV_(kL{^FJ+@k{LXoLQM68IZA|NuPtuoY! zLzNkcGD`>%5fnlaTaN=GiKsvUAuVwPLWDp7g~Zo^FolRn7=nq)5F~^cLI@dopB=zT zdwPA>`L6druE5^eB>UOxS!><*Z(aRG0;>!uu?IPA?akJ?o4ocP@jZ9%kKOv@0_m#- z3*#M9;cg-~G-z_gYvrKWTQism&=i!m zHd5hAKmd%ZTL;iLq~6qadu8NauG=k4*%6{K>#Xc$-Qsdlj0COhr`b2_nxbFzNe#Fn z-BMoDCr!*cDU=sRD=_kM;pKklpC)__KBwi?cRB)q2EM;V@N9twKCMt!alY?>;g#g9 z%+`@@fCX5hH+lRYti1wvdijb>Q#*zy{fT-D{nnNAIF6fhI*W?mVQ(o?5?^PdXf(6Z2gxP zYE3x5A;Y`>NqeF?Fze@%nA6J&enf25zv@dtiFkcW4o`aePmYs@& z$3c;DnX8bvfuQLRJ*@pHNaeq#0Wx+4PDC{rEr1DP%wGNNMl}z#`Dld)u-Zy?u_V*p z33aeCvz%%HGjAW}~}FWa8G+KG`zsPrQ{4awJs=P=M1mPI6%8{2hUk{SuxrLP~` z`7U5$?BX=+ni8i3nAgOP8%sDMN*dn_5y_fXJ-&SHK^9g;w%mmn)UmBKCcmaW^2iwm zerDJmAoN6=?Z~*;xj9)7J2YiaAV>gP0IFI3f8_>gOU=+c3~y(tN4iqCru7E!UdGIn zf!sap$X{zDYq+uX-I%eC=~x1g-F7-V9yKJrxNB>LUdjIoT8`gvAb0Vdv6=R-b)Mhy zfcbAyNQ6|5+wA5wYkWZRg#PqF!hG~jx?|#?EWaRVkGMWgGvj^QfJ}@cPS=A(_p1|7 zGw^9P++5!btl89GcbjRRvM(hRJmg-w0?~Rr*2l#LpVUduwxkmIZRHiSn}2Zr+9Dvj zKPdemAbwjA%SuY-UxnWF%S52D6Wq&7|5J5Rn$)8#*332fd|YRF7}q`iI%Ni#l0o^a zV?Y$yaFP&V^!ObOBRdB7iWii~xdbv|$ky)>F>vExPfwG^6{|IM7!QBQqWxn3tVj;& zB9lTOzrY86pl4@x7?u_sj$-B+wFc4R-A+7DKCUQNn9F*dG-(tis!Xn0oj@Fb4q_BB z)#LYhJSM#B*l-2(z>K(=~k-rh4*1U)dSo)LGjGNBV{DPor?qP3KBk%e7p#}ogD>NMN*Io7vB6l7_6h_q<+u~g z@5xG30k|>Cr}Daq1o&&&KMai3bukG=rZrP`RVQ3X;SbVCxQ92<-@K^2ay{nBmIYPM z087!&iI;>|g{uts&p5}_$^fj#xcIy<@lG_mPfmdMC4A_gr33p$>&JOYEC01f#6YMu znbHlX$*&6l32^K$U8z_DogAdT#MR*==(mB@3oH{zx_>v2DbG%pxV$ zB2#^>cVK-~b=WRdRahvvE6UewhpFhJnxI0s=Yn=wY9o(jS(klLnufEP@0Y2*ppURS z$%@SU2B#Yhj;z14k2nVJSXl$i*CaOAA?ye$Ipk`%M2^htNJgBdc=I%jSTmBFA)Ry~ ztg=@bTw#u@k283?e$X_=5wmns=$R6ytc~Mdt}P_5Ceo`#urv#ck3nkrSpnlg(iN89 zbBE#*?q;9O7F%6DS>7ETjQ5MyIT za~oB0h2IuN_Gw_)`cq&jw~E_aiKfB^e+SskCy8@~)=EcmBUwB8SwGmQ29hpZteB|= zzN3W0vWr~*H_em;CVaQwX%z8w@dZG!ac50q5A%GVud7s|?h{4fOlsU7B|RoofUw|U zck_~H@(&-ZdQwx{Z0uzIOF=m=Pz8=(I z%RF9|xoHDus!yJVR_uciy>etQig{)RiVCMZ<-b2mph~9!;k8mkWisX{0@u|Xs9*~z z(|%;GFvc2EXe+_5p_1CpP08efYqSuJDyWoIYo0>*h+_wS z^&BL3*F#sLBmHo7F@k&Cra-Rn!l08d3W64JWhVsK6TF5Z&-&?XNVy1JJB6%$4iXo~ z4ZVAV7C_g7Bhn6d=fGPjT908vSGm6)Nx|u<*wP61+b!a4XU0CEIZ@(ps9ct73OLbG z^IY{gn)nIwkI7nPT~7P{<_V9v?$$D6n_{QZx-=INtax+aOkl#Q>hvOjxokcLMLieb z8*`}pHhVAZ5JtJ=#YNET3JXAT*+POj(R`qR9byrgXzq%)$0cin%b>>9R8lXfbr?~} zj$3=#&lV^;nCG|}2Ez&&$7+r8Wr6wwc!LMZ5Is8f?#0}UQ7fYf#nFE+Nz=E&k|p_C zP36~WP2be=M%#4V6RLm0jO2M6H;Kuzs98=}U{X{ZuHm~% zUXX)lHo7ql9COlTR;hT_Q?05+5vTO_EJaLaby7rKcN?YBG#PgoQf+kg6x=W25Ig9B z%7(mzEH;`Ki~@&mBSHDmS8E){^>>!rYZ|(!nzWfB)up^vE*e%rz&!``;!<;e51G3XBdmfzuuy_@QIsVNctfKSWR4G+nQ0-Vk! z>mglPaEfbE)p8@P02JapZ!Ta_D7S0FU#Ww8`}<%S(P_BlUE#h7SzWMHWL0?NMSNKf zw}tj81*OVVHRtz2rTG@Wor!*l%9C8g&hSbd?e&J(FI)jW`O44-r|ddp z1zp>_-=iK8ave6O_Cx+p$cyC)u-xito2-e4IiP5$J7eyegKH?!e9!YtL|c_4*mS9O z5{Y*`Y=g^4?377O*L1HOU14r;^l!&-G^o{v+oV?>3McFG5>Q(zb*|lepp%O5DivKV zD?pVRrP?s@kD7I3CM(`o$?G$hS6)@gm``IxauJ|)ch^K@icj{IjZPEqx)~hxO%2U# z7u&USd`;n<^06nN<|xFghfvg~vc*|$9nBN#uRAb-4NG?Y*Tf_7FCJX3S}f^u;K+5*c8(2hIv0$uX_xs;upWiIJ!Z? zgTzFB+9kd#Bok3;f1;5fm8a`fh?Ab4R~b!YM>76&zzR{yhl*h%S7n(W7SNC1xBU9q z)KC(V0o>>juzmNl9+$1gB>KyhoBJGWn2vUvKper8Qry+idRaueprG9rl#Etm8ywD6 z)|J%01#aQnXDypzM=8}^9CPNEPVsQR2>X(fvsp@j1(~lM{*RA4)jO01Zu@QbjyT3W z_)#}=Erk|eqH*ajgPxHi^LE};h8EiV8XWy*zNIni#rnSR4Q3ZzR~9dRq@bEFBAp{O1yBSAXPe3&V(fHsDJ&$IKf_&P9x?oFhu0y0EdV8y?zta!t zx@&aXE?e+7wM4zo_X(x{^FrxOs3`M5sCW6Uvt7V4vfbiV!W!lb)3>^9skxitdw@76 zD{Ma2Gc{6C(kBiuF?z;tc@Zww#2yc|Y1z*f@W2lDlyZ{-g5X_VK@598+c+#-!Qfo3 z3#z>4^A40;+5bHcMT!Mth_?x^)Kxo`K}uS`WnwC2b%~OkLWc0~ZAlP?Z;4m$@IoHwZ#3*&IOr%!h9Nc0XHOQURJKTX@h&OmBZ+1Axtx4jh zIEnjkm-svcJv!b%n+|fDxojU~mwdJXQcZwhGRjd=e=~X(vPZZ;@lKw?;Zi__*Wge( zR49<46w(OCm9+S+PzNpbCu#)Knlx!#=(vB5)YUOi!~3x}fVW8<{31lW89%8y;#xke z2nT1ln|TYZ8-F3HnVEhy^|rovNz>TR`{%++QAV#HX^%aZyFwmlSJQH=r|t~sNZuwK z)>F4EQ4NW_6zpeixn^h?PuDVqs;JYtOl*twPj>5arbfzoq+ObaM3g>NGxdfEG%C5a z24C;`H^L9-^<}qFck=3TPU=U6e2z&~fNMCnOgQt2N&D`2!=Oozhl+v}+RdE7F$z3! z3YzM2*9`YipQ(H-*JzobPzJI&5T=@CaJ;k&b%HVKUk$xrQ1`ot{8!=qjeWO-n9U6D z*>r~VzDi#8cZgx}aO&jvBA3-rE@N&w(47#WEfJm){=J8P3%@Oxe{^E_nQiKaeQv!b zTlWtsq_@2@2vT*l4~2La>%mWig#{$S>L=Ocs9F;%iEcqqQ%gF_9I zfIr4BBVDoYC|GqL&dY(Yi~#X*3$R_>aiW>aBa8;)rudeUkd~TWmd}j&0xJ1zzm2K! zSL(hW@F{yT?5j`9`)*m|ty&NB$gGmsns8Kz7sdvNQDvnaDU|iz_IR|3LELxkj=GQm z-sH8l#j?xqvB=4nQZb@Z!i&|-NMBL+{?lUG^~Eono|!mcUm*+d8#P}puTI~~ey9lS>9VL-I6Iv|X#KJyYXJ6cXKqMVgE;{s?lXWksJ&zt}e>t45YLFrpa4Q#h@gN&{BO`8iF>8N-IGx7sLv z*&Qn5 zhb}^J8sdPml&Ku0W8#l(wlS(qcK!l^KYlt2>@VB~>&_Peu{Lnw1IeZmNX)`}R1YzJ zIDF?Y`srHwlf68UHx&_%C2mYQP<<@{dXitl=u}4C)1L$nt~csatTh@7se*E~?xS^* zyOEAZI`&?aAk{s;0M5945S=CUarGgT9gHzsAW_+s^N8+A^zDjg_0?XQ@*B@tAMFsG z!_4n)^nFfU!TzGlsLQV!yw{=rPU_5fHx;j8!TIJzh@{`v|Gy-It;d$2YOp0zO2tDK z7^t#BUX5x{mO7Q5%&<;mPqX{5|l673N;rUJ}$^%P=@<<*97@moD{HjC|2;S3I7Vccio+-42Am zj3aa5??FYsD0O$aZ7uynP&Z`*FNiZHo+exUuI|OQZQ{N+0>qeTX z;=U8;-GszDpjAcb=@|35RcOcKga-eI1$oH9N!X(gm%E{GN%ZPo7j)X5^##`LWS?~b z{<&9!4;Eq$o&>yrNjAM}NyDthvax{wzT-@5de0%*i~uH6v3`ZdTj85mQ;e4wY%Av~ z8&qi}pj>8=ZqC`G>(Md}Dms)@y6%DDO+fCRSXcQ+*5CpF2XDPI$VSavg(rYo9!>(S zC$lruB>G6LSof&|GcGy^|I(b_f43LpcO2Y~xI+BZSxJc<*Rzog!sP&{#&7Z9ey`%8 z?!=XW`lc;{gdCOFZ#h>^?MmIKrpS%+g1u(AU;Y_ryQ)xNn=THNU9J;@a0!FLWwsX- zF2nY`_SuM3KzoNWYf>bOIIP&5#TINoYiN8ce2n2c)ZTdKMs;A|Qj|YvXA~!W8uk~v zX=(Uac=ixlF0VqP59W~kf4EPvY!R~v&wb=pfW`s;3mOOAugf|uv!uoke(vdJS6OsW zimx}07p)h@17dsiJNKC#BC#IF(~I!1vjTKS_~8%7_r@;-rc-;g(5|KjeA*%Dle*UQM_5+<uCaQ*ce^^-ZQV0S*n{j;}fx;u!~eO#Pt8 zD8H=hxS2XiBSs21`u8?~$b-ShzT2oJFOgxgQj%n8 z2P^SaOK=C_FQRy}+V!n^()uFU0Ik3Z$jWKFJ;8d>JYg7Y9oj8h;wPfClTlm2`5iBj zBl^o!-4jV8o12HjeS(urDY{Ao1(7Wny+h4sUVyd?{Mm_Sp@SCfQnhu{CwxKOqT)r%fNl{QcS$ z{^#Nw`FIIrT06Rr!<+{FuuVtzsrK7wB@MnZ$w8nmF=!WUnUnkaC-%ZcP`omTu6gsB z3G)Me=GF?qe=w(4X@B|~{zC_qr(x9adjmSEy1>bgdh`mNN%(=|wz=g8kuKfVfK&@s zRtl}xF+dKyz_D8eF}PNUAy{0)9R&gfaF<=CVRb*CUVF)V7iuR8HQ+#Uvq`*-oh;h= zjO{+d;PP}J@`i5!ciY_?w&kweOB~nWPB6g+5=!s}K_7{oNkkS~Z+kD_nioCe?=>kL z0~u^Lf~vGAB3D6r7lgFj}BrLSr(TX2s+S`MOa|6H_97H zK+k9|5GGHo3;L5pfx45(j<-Vn7T{ltE3dEN|a!0J6SW}3ZDF5aN^7s$nhsgh)OgZ z54DMao={en%`tgX`fgqm2lA*5Rw^AyneN!)&HQ`~0EK9&U00YFmJ~!+F?QM1WCAzP z<&Y`n!x~?ie?m&xaRL1kQutbElHMNqWOGkN$Ml91t3EcUw-WAF3%riU%eD67>N|e@ z!;*C5o+;u(ZVXZa013aulQk!u&lNfY^o4cF@@+J4z+AHBf7R2;r!r%4d}vJug!P^1 zsr~Xv=wMWnPQfoxD)jqEp}p8T4qBh5>Tc@hB!Mn){$1?vb(Lj!Z7XWF0=SlgSBi4y z%}_4*8OIsje6}QjX1H zGwLH5s>lQsu@UeX>hi(lANMgBUfD{bdoq4~@%m?6a=UG;%LOaeI<36gqydL@83j+& zyN?TOjy3dN7}=ZK65n!_7|f8I-zeM|EQDv=;COq$V!EC!>7&4YmSo}IeAGb5s0!QN z)@J{@Nra}Dfk)uejQd|4vc|kv`O13sa3?54zlBp`+(749 zOk2wwaWXWs#)=uy;P!}AXEth0yQb|Ytxf!%=cMEEmk;Ub*SjY&D5DnXfzMzW>eWGs zx49vqIS3wVlYpKapT&l8hjXP2CYnYh>%ix*yMO2`dt5z3XlZoUx5{oPZJznZ;Ni)W zdQ4mQXx&S3R_2`vMLTmVp32u)CIwgy0QM-gtp&d2R+2;m2H7f~fSI%g25UGolaEm7 z@TrFg^xp=Vm>`VZmhJp01q&VCAo`IF4-$|AF+Q%cVwZcy4-%SWmYj_EjzqBS1UJ*6 zvqGju4pQQ&DBa_AYn0-sH=q4zNG&rH?2vgN53mLM5v$6c8^~=cCz8SKynF-;}|QRzAGo7bLKHv)u#E?d#ELTVKGy}^iP8;E*T(-rKg|S7J^clQ` z64$0E9j4B4)S^PJkGf0pT>_V4zOx18|DAq2uHqxou1D8{obq3p7R?ZC>1<1xhAbT%O7AO)^iRi~6XdPQ3rT@U#;)CN|_G#O0oC_RHR;$5Qg zu5JIfzQG4T%5?{MMVg4cHMH0I25v1=rfY(_o(7xdw|f8m()_O%_iZ6w^@^^4+ih28 zZw}}S0_MshrY08;y4PrEao38)5-)v)S1|#;x{vP;E`F2C)C`F`bk_~z!8X9)ZA=kP zUMi^9<<3kn`R2HBzL9u${K_Ds3D0|PZjU649h4P0BD?xA+?&O#C+lQ!aKWwY@Hd-d z2{9Ugv2QopYE(RngujoG~w1EeC_VbP?Bxybw2j zzIAxwwA5|_JR!hGiI>(Ow8s}2HTMPQg#LZ>%-{+;5w)!0DJl~|TTB}{qiv9z-=FLi zMUj2UXvBR2ne|3kI&7}TabsQZNxVhnd*b&ML%r4ck$)0_z?_cX@)C9w#T zB}P=3?-m(>fqzd@4-BB{Z*9sR`rK0fb#q5PA}o;7rRm*flP?gxq1}kp@l|omn6{>b zScH;V8Qwi?-PINVU2CPz86pjv@-Wf@mC(-74^h_VV9AM;u#JGZ~g(SSX0kAr^{@ zJG)`L^~SWxT5W&joj?wA*okb{y=hX}$!6|L)6Y3Cqk-{0$*%yKselsx!(JpYT$I#< zDWri|h+KB8O}Ds_dKx>XZVeX*z=YGo+$_OI4x!BK2P_7U>Wb1s$OXaqf+VlLwO8t)lm5`G1e?^hia#c z-~ES2Z#>|ILO0BD?~uG>Mfj1K67Fz<-Qb1nXLECG8pW7M(>TDASH2Z1)Z zeaOqvYql@9JYmkk`ee>qw{kxD0xH5@=Ih~^QD6ZBHzRKP6a5dS&t-7!Q67{N7?`$n z-e; Date: Thu, 13 Jul 2023 09:13:45 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9IDE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=92=8Clibs=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuwenlong --- thirdparty/oneDNN/README_zh.md | 6 +++--- thirdparty/oneDNN/docs/hap_integrate.md | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/thirdparty/oneDNN/README_zh.md b/thirdparty/oneDNN/README_zh.md index da3e3d27..7e708c13 100644 --- a/thirdparty/oneDNN/README_zh.md +++ b/thirdparty/oneDNN/README_zh.md @@ -2,10 +2,10 @@ ## 功能简介 oneDNN是为深度学习应用开发的一块跨平台开源库。 ## 使用约束 -- IDE版本:DevEco Studio 3.1 Beta2 -- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) - 三方库版本:v3.2 -- 当前适配的功能:提供数据的序列化框架 +- 当前适配的功能:提供CNN基元、RNN原语、元素操作、支持多种函数和优化的数据布局。 - [Apache License](https://github.com/oneapi-src/oneDNN/tree/v3.2/LICENSE) ## 集成方式 diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md index b26974b5..6c1a98e4 100644 --- a/thirdparty/oneDNN/docs/hap_integrate.md +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -6,8 +6,8 @@ - ubuntu20.04 - [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) -- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) -- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [ohos_sdk_public 4.0.8.1 (API Version 10 Release)](https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_4.0.8.1%2F20230608_091058%2Fversion-Master_Version-OpenHarmony_4.0.8.1-20230608_091058-ohos-sdk-public.tar.gz) +- [DevEco Studio 3.1 Release](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2F81%2Fv3%2FtgRUB84wR72nTfE8Ir_xMw%2Fdevecostudio-windows-3.1.0.501.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230621T074329Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) - [准备三方库构建环境](../../../tools/README.md#编译环境准备) - [准备三方库测试环境](../../../tools/README.md#ci环境准备) @@ -56,7 +56,7 @@ ## 应用中使用三方库 -- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示: +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,动态库文件会自动拷贝到libs目录下打包,如下图所示: ![thirdparty_install_dir](pic/oneDNN_js.png) - 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 @@ -69,10 +69,11 @@ target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/include) #将动态库打包到libs + file(GLOB allLibs "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/*.so*") add_custom_command(TARGET entry POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/oneDNN/${OHOS_ARCH}/lib/libdnnl.so - ${CMAKE_CURRENT_BINARY_DIR}/../../../../libs/${OHOS_ARCH}) + ${allLibs} + ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/) ``` ## 测试三方库 -- Gitee From 8448f0bab94baa7eb7e16dd598463a26ccf393b2 Mon Sep 17 00:00:00 2001 From: xuwenlong Date: Fri, 14 Jul 2023 09:14:33 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9abiFilters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuwenlong --- thirdparty/oneDNN/docs/hap_integrate.md | 4 ++++ thirdparty/oneDNN/docs/pic/oneDNN_build.png | Bin 0 -> 52138 bytes 2 files changed, 4 insertions(+) create mode 100755 thirdparty/oneDNN/docs/pic/oneDNN_build.png diff --git a/thirdparty/oneDNN/docs/hap_integrate.md b/thirdparty/oneDNN/docs/hap_integrate.md index 6c1a98e4..5d444d35 100644 --- a/thirdparty/oneDNN/docs/hap_integrate.md +++ b/thirdparty/oneDNN/docs/hap_integrate.md @@ -57,6 +57,7 @@ ## 应用中使用三方库 - 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,动态库文件会自动拷贝到libs目录下打包,如下图所示: + ![thirdparty_install_dir](pic/oneDNN_js.png) - 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 @@ -75,6 +76,9 @@ ${allLibs} ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/) ``` + 修改IDE的entry/build-profile.json5 文件,增加编译架构过滤:"abiFilters": ["armeabi-v7a", "arm64-v8a"], 如下图所示: + + ![oneDNN_build](pic/oneDNN_build.png) ## 测试三方库 diff --git a/thirdparty/oneDNN/docs/pic/oneDNN_build.png b/thirdparty/oneDNN/docs/pic/oneDNN_build.png new file mode 100755 index 0000000000000000000000000000000000000000..3a44fbf78c725c6d94bc99434b2eca64cf72b8a9 GIT binary patch literal 52138 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