?
?
本文轉載于極術社區
極術專欄:Arm 技術博客作者:Arthur Ratz ?在物聯網主板和創新的微型納米計算機上,用C++17和CL和SYCL編程模型規范構建并運行現代并行代碼。這些處理器基于革命性的集群對稱ARM Cortex-A72 CPU,采用ARM AArch64架構。
下面的博客文章提供了用C++17/2x0構建現代并行代碼的實用指南、技巧和教程。它們使用CL/SYCL編程模型實施,并在基于創新的ARM Cortex-A72、四核64位RISC CPU的下一代物聯網主板上運行。
讀者可以在Aksel Alpay的hiSYCL庫項目的開放源碼發行版中找到用C++17編寫的并行代碼。另外,關于安裝和配置LLVM和Clang-9.x.x ARM AArch64-工具鏈,用于構建并行代碼可執行文件并在功能強大的ARM Cortex-A72 CPU(采用ARM AArch64架構)上運行它。這篇博客文章主要關注在最新的Raspberry PI 4B+板上構建和運行特定的并行代碼可執行文件,這些板基于Broadcom BCM2711 SoC芯片,專為嵌入式系統和物聯網而設計
?
?
ARM Cortex-A72 CPU的樹莓PI 4B+物聯網主板
?
2016年,ARM宣布發布革命性的新對稱Cortex-A72 CPU,配備64位ARMv8-這是一種硬件架構,完全支持大規模并行計算。這是物聯網電路板和微型納米計算機的下一個巨大時代,包括覆盆子PI 4B+電路板。它們是為實時大規模收集和處理數據而設計的,作為嵌入式系統和物聯網集群最重要的組成部分。
?
ARM Cortex-A72 CPU以1.8 Ghz時鐘頻率和最新的LPDDR4-3200 Mhz RAM運行。根據SoC芯片和物聯網主板型號的不同,它們的容量高達8 GB。它們滿足了從事高性能嵌入式系統和物聯網集群設計的軟件開發人員和系統工程師的期望。此外,針對特定的CPU型號和版本,Cortex-A72 CPU具有革命性的高二級緩存容量,從512KiB到4MiB不等。
?
使用ARM Cortex-A72的一個例子是Broadcom和Raspberry Pi基礎供應商制造創新的BCM2711 SoC芯片和Raspberry Pi 4B+IoT板。
?
Raspberry Pi板以“可靠”和“快速”的微型納米計算機而聞名,這種微型計算機是專門為數據挖掘和并行計算而設計的。ARM集群對稱64位RISC-CPU的主要新硬件架構特性(如DSP、SIMD、VFPv4和硬件虛擬化支持)顯著提高了使用Raspberry PI進行大規模并行數據處理的性能、加速和可擴展性。
?
具體來說,基于ARM Cortex-A72 CPU和4GiB或更高內存的樹莓PI是最適合物聯網數據挖掘和并行計算的解決方案。此外,BCM2711B0 SoC芯片還捆綁了各種集成設備和外圍設備,如Broadcom VideoCore VI@500 MHz GPU、PCI-Ex千兆位以太網適配器等。
?
我們使用物聯網進行并行計算所需要的只是一個Raspberry PI 4B+。或者,任何其他基于ARM Cortex-A72 CPU和LPDDR4系統內存制造SoC芯片的物聯網主板。
?
我們將演示如何設置一塊樹莓PI 4B+電路板用于首次使用,開箱即用。
?
以下是預先滿足的硬件和軟件要求的簡短核對表。
?
硬件:
?
Raspberry PI 4型號B0,4 GB物聯網電路板。
用于Raspbian操作系統和數據存儲的16 GB Micro-SD卡。
直流電源:5.0V/2-3A,帶USB C類連接器(最低3A-用于數據挖掘和并行計算)。
?
軟件:
?
Raspbian Buster 10.6.0完整操作系統。
Raspbian成像器1.4。
MobaXTerm 20.3內部版本4396或任何其他SSH客戶端
?
?
設置Raspberry Pi 4B物聯網板
?
在開始之前,我們必須從官方Raspberry Pi存儲庫下載最新版本的Raspbian Buster 10.6.0完整OS映像。我們還需要下載并使用適用于各種平臺(例如Windows,Linux或macOS)的Raspbian Imager 1.4應用程序。
?
- Raspbian Buster 10.6.0
- http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2020-02-14/
- Raspbian Imager 1.4
- http://downloads.raspberrypi.org/imager/
- MobaXterm 20.3
- https://mobaxterm.mobatek.net/download.html
-
默認情況下,擦除SD卡,將其格式化為FAT32文件系統
-
將預安裝的Raspbian Buster OS映像(* .img)提取到SD卡中
-
由于成功完成了前面的步驟,因此請從讀卡器中取出SD卡,然后將其插入Raspberry Pi板的SD卡插槽中。然后,連接微型HDMI和以太網電纜。最后,插入直流電源電纜的連接器,然后打開電路板。最后,系統在安裝到SD卡的Raspbian Buster OS引導下啟動,提示執行多個安裝后步驟以對其進行首次配置。
- 打開bash控制臺并設置“ root”密碼
pi@raspberrypi4:~?$?sudo?passwd?root
?
- 以“ root”權限登錄到Raspbian bash控制臺
?
pi@raspberrypi4:~?$?sudo?-s
?- 使用以下命令升級Raspbian的Linux基本系統和固件
?
root@raspberrypi4:~#?sudo?apt?update
root@raspberrypi4:~#?sudo?apt?full-upgrade
root@raspberrypi4:~#?sudo?rpi-update
?- 第一次重新啟動系統
?
root@raspberrypi4:~#?sudo?shutdown?-r?now
?- 安裝最新的Raspbian的引導程序并再次重新引導系統
?
root@raspberrypi4:~#?sudo?rpi-eeprom-update?-d?-a
root@raspberrypi4:~#?sudo?shutdown?-r?now
?- 啟動“ raspi-config”設置工具
?
root@raspberrypi4:~#?sudo?raspi-config?
?- 使用“ raspi-config”工具完成以下步驟
- 更新'raspi-config'工具:
root@raspberrypi4:~#?sudo?apt?install?-y?net-tools?openssh-server
?這兩個軟件包是配置Raspberry Pi的網絡接口或OpenSSH服務器所必需的,以便使用MobaXterm通過SSH協議遠程連接到開發板。
?通過修改/ etc / network / interfaces來配置板的網絡接口'eth0',例如:
?
auto?eth0
iface?eth0?inet?static
address?192.168.87.100
netmask?255.255.255.0
broadcast?192.168.87.255
gateway?192.168.87.254
nameserver?192.168.87.254
?在網絡接口旁邊,通過取消注釋/ etc / ssh / sshd_config中的以下行來執行OpenSSH服務器的基本配置:
?
PermitRootLogin?yes
StrictModes?no
PasswordAuthentication?yes
PermitEmptyPasswords?yes
?這樣就可以使用SSH協議以root身份登錄到bash控制臺,而無需輸入密碼。
?最后,嘗試使用MobaXterm應用程序通過網絡連接板,并打開到IP地址為192.168.87.100的主機的遠程SSH會話。您還必須能夠使用先前設置的憑據成功登錄Raspbian的bash控制臺。
??
?
使用CL / SYCL模型在C ++ 17中開發并行代碼
?
2020年,Khronos集團宣布了革命性的新型異構異構計算平臺(XPU)。這提供了將“繁重”數據處理工作負載的執行卸載到僅主機CPU以外的大量硬件加速目標(例如GPGPU或FPGA)的能力。從概念上講,使用XPU平臺進行的并行代碼開發完全基于Khronos CL / SYCL編程模型規范,該規范是OpenCL 2.0庫的抽象層。這是一個小示例,說明了使用CL / SYCL模型抽象層實現的C ++ 17代碼。 ?
#include?
using?namespace?cl::sycl;
constexpr?std::uint32_t?N?=?1000;
cl::queue?q{};
q.submit([&](cl::handler&?cgh)?{
????cgh.parallel_for(cl::range<1>{N},?
????????[=](cl::id<1>?idx)?{
????????????//?Do?some?work?in?parallel
????????});
????});
q.wait();
?C++17中的代碼片段(如前面所示)完全基于CL/SYCL編程模型進行交付。它使用默認參數初始化器列表實例化一個cl::sycl::Queue{}對象。這是為了將SYCL內核提交給默認使用的主機CPU加速目標來執行。接下來,它調用cl::sycl::Submit(...)。只有一個參數的cl::sycl::Handler{}對象的方法,用于訪問提供基本內核功能的方法。這基于各種并行算法,包括CL::SYCL::HANDLER::PARALLEL_FOR(...)。方法。
?以下方法用于實現從運行中的內核中產生的緊密并行循環。此循環的每個迭代都由其自己的線程并行執行。CL::SyCL::Handler::PARALLEL_FOR(...)。接受cl::sycl::range<>{}對象的兩個主要參數和在每次循環迭代期間調用的特定lamda函數。Cl::sycl::range<>{}對象基本上定義了正在執行的并行循環迭代的數量。對于每個特定維度,在折疊多個嵌套循環和處理多維數據的情況下。
?在上面的代碼中,cl::sycl::range(N)對象用于在一個維度中調度并行循環的N次迭代。PARALLEL_FOR(...)的lambda函數。方法接受另一個cl::sycl::id<>{}對象的單個參數。除了cl::sycl::range<>{},該對象還實現了一個向量容器,每個元素都是并行循環的每個維度和每次迭代的索引值。以下對象作為參數傳遞給lamda函數作用域中的代碼,用于檢索特定索引值。Lamda函數的主體包含并行執行某些數據處理的代碼。
?在將特定內核提交到隊列并生成以供執行之后,以下代碼將調用不帶參數的cl::sycl::Wait()方法來設置屏障同步。這確保在被派生的內核完成其并行工作之前不會執行任何代碼。
?CL/SYCL異構編程模型效率高,具有廣泛的應用前景。
?然而,英特爾公司和Codeplay軟件公司很快就不再支持CL/SYCL對硬件架構的支持,而不是“本機”x86_64。這使得不可能使用特定的CL/SYCL庫、針對ARM/Aarch64和其他體系結構來交付并行C++代碼。
?目前,有許多CL/SYCL開源庫項目,由廣大開發人員和愛好者開發。它們支持更多硬件體系結構,而不僅僅是x86_64。2019年,德國海德堡大學Aksel Alpay實施了最新的CL/SYCL編程模型層規格庫。它針對的是硬件架構,包括Raspberry Pi的ARM和AArch64架構。它向GitHub(https://github.com/illuhad/hipSYCL).)%E8%B4%A1%E7%8C%AE%E4%BA%86hiSYCL%E5%BC%80%E6%BA%90%E5%BA%93%E9%A1%B9%E7%9B%AE%E5%8F%91%E8%A1%8C%E7%89%88)
?此外,我們還討論了如何安裝和配置LLVM/Clang-9.x.x編譯器、工具鏈和hiSYCL庫發行版。這是在使用該庫的基礎上,用C++17交付現代并行代碼。
??
安裝和配置LLVM / Clang-9.xx
?
在使用Aksel Alpay的hipSYCL庫項目的發行版之前,必須正確安裝和配置特定的LLVM / Clang-9.xx編譯器和Arm / AArch64工具鏈。為此,請確保您已完成以下步驟。 ?1.更新Raspbian的APT存儲庫并安裝以下必備軟件包:?
root@raspberrypi4:~#?sudo?apt?update
root@raspberrypi4:~#?sudo?apt?install?-y?bison?flex?python?python3?snap?snapd?git?wget
?前面的命令將安裝備用的“快照”軟件包管理器。這是安裝正確版本的cmake> = 3.18.0實用程序以及'python','python3'發行版和'bison','flex'實用程序所必需的。通過使用'cmake'實用程序,從頭開始構建hipSYCL開源項目需要所有這些。
?2.使用'snap'軟件包管理器安裝'cmake'> = 3.18.0實用程序和LLVM / Clang守護程序:
?
root@raspberrypi4:~#?sudo?snap?install?cmake?--classic
root@raspberrypi4:~#?sudo?snap?install?clangd?--classic
?安裝'cmake'實用程序后,讓我們使用以下命令檢查它是否有效,并且已經從'snap'存儲庫中安裝了正確的版本:
?
root@raspberrypi4:~#?sudo?cmake?--version
?運行此命令后,您必須看到以下輸出:?
cmake?version?3.18.4
CMake?suite?maintained?and?supported?by?Kitware?(kitware.com/cmake).
?3.為LLVM / Clang工具鏈安裝最新的Boost,POSIX-Threads和C / C ++標準運行時庫:?
root@raspberrypi4:~#?sudo?apt?install?-y?libc++-dev?libc++1?libc++abi-dev?libc++abi1?libpthread-stubs0-dev?libpthread-workqueue-dev
root@raspberrypi4:~#?sudo?apt?install?-y?clang-format?clang-tidy?clang-tools?clang?libc++-dev?libc++1?libc++abi-dev?libc++abi1?libclang-dev?libclang1?liblldb-dev?libllvm-ocaml-dev?libomp-dev?libomp5?lld?lldb?llvm-dev?llvm-runtime?llvm?python-clang?libboost-all-dev
?4.下載并添加LLVM / Clang的APT存儲庫安全密鑰:?
root@raspberrypi4:~#?wget?-O?–?https://apt.llvm.org/llvm-snapshot.gpg.key?|?sudo?apt-key?add?–
?5.將LLVM / Clang的存儲庫URL附加到APT的源列表中:?
root@raspberrypi4:~#?echo??deb?http://apt.llvm.org/buster/?llvm-toolchain-buster?main??>>?/etc/apt/sources.list.d/raspi.list
root@raspberrypi4:~#?echo??deb-src?http://apt.llvm.org/buster/?llvm-toolchain-buster?main??>>?/etc/apt/sources.list.d/raspi.list
?為了能夠從特定的APT存儲庫安裝LLVM / Clang-9.xx編譯器和特定的工具鏈,必須完成上述兩個步驟4和5。
?6.刪除到已安裝的LLVM / Clang早期版本的現有符號鏈接:?
root@raspberrypi4:~#?cd?/usr/bin?&&?rm?-f?clang?clang++
?7.再次更新APT存儲庫,并安裝LLVM / Clang的編譯器,調試器和鏈接器:?
root@raspberrypi4:~#?sudo?apt?update
root@raspberrypi4:~#?sudo?apt?install?-y?clang-9?lldb-9?lld-9
?8.創建到已安裝的'clang-9'和'clang ++-9'編譯器的相應符號鏈接:
?
root@raspberrypi4:~#?cd?/usr/bin?&&?ln?-s?clang-9?clang
root@raspberrypi4:~#?cd?/usr/bin?&&?ln?-s?clang++-9?clang++
?9.最后,您必須具備在bash控制臺中使用'clang'和'clang ++'命令的能力:
?
root@raspberrypi4:~#?clang?–version?&&?clang++?--version
?在這里,讓我們使用前面的命令檢查已安裝的LLVM / Clang版本。使用命令后,必須看到以下輸出: ?
clang?version?9.0.1-6+rpi1~bpo10+1
Target:?armv6k-unknown-linux-gnueabihf
Thread?model:?posix
InstalledDir:?/usr/bin
clang?version?9.0.1-6+rpi1~bpo10+1
Target:?armv6k-unknown-linux-gnueabihf
Thread?model:?posix
InstalledDir:?/usr/bin
??
下載并構建hipSYCL庫發行版
?
另一個必不可少的步驟是從其源代碼下載并構建開放源代碼的hipSYCL庫分段發布,這對GitHub有所貢獻。 ?通常通過完成以下步驟來完成:1.下載hipSYCL項目的發行版,從GitHub克隆它: ?
root@raspberrypi4:~#?git?clone?https://github.com/llvm/llvm-project?llvm-project
root@raspberrypi4:~#?git?clone?--recurse-submodules?https://github.com/illuhad/hipSYCL
?Aksel Alpay的hipSYCL項目的發行版與另一個LLVM / Clang的開源項目有多個依賴關系。這就是為什么,我們通常需要克隆這兩個發行版,以便從頭開始構建hipSYCL庫運行時。
?2.通過使用'export'和'env'命令設置從源代碼構建hipSYCL項目所需的環境變量的數量,并將以下特定行附加到.bashrc配置文件腳本中:?
export?LLVM_INSTALL_PREFIX=/usr
export?LLVM_DIR=~/llvm-project/llvm
export?CLANG_EXECUTABLE_PATH=/usr/bin/clang++
export?CLANG_INCLUDE_PATH=$LLVM_INSTALL_PREFIX/include/clang/9.0.1/include
echo?"export?LLVM_INSTALL_PREFIX=/usr"?>>?/root/.bashrc
echo?"export?LLVM_DIR=~/llvm-project/llvm"?>>?/root/.bashrc
echo?"export?CLANG_EXECUTABLE_PATH=/usr/bin/clang++"?>>?/root/.bashrc
echo?"export?CLANG_INCLUDE_PATH=$LLVM_INSTALL_PREFIX/include/clang/9.0.1/include"?>>?/root/.bashrc
env?LLVM_INSTALL_PREFIX=/usr
env?LLVM_DIR=~/llvm-project/llvm
env?CLANG_EXECUTABLE_PATH=/usr/bin/clang++
env?CLANG_INCLUDE_PATH=$LLVM_INSTALL_PREFIX/include/clang/9.0.1/include
?3.創建并更改為hipSYCL項目主目錄下的?/ hipSYCL / build子目錄:
?
root@raspberrypi4:~#?mkdir?~/hipSYCL/build?&&?cd?~/hipSYCL/build
?4.使用'cmake'實用程序配置hipSYCL項目的源:
?
root@raspberrypi4:~#?cmake?-DCMAKE_INSTALL_PREFIX=/opt/hipSYCL?..
?5.使用GNU的“ make”命令構建并安裝hipSYCL運行時庫:?
root@raspberrypi4:~#?make?-j?$(nproc)?&&?make?install?-j?$(nproc)
?6.將libhipSYCL-rt.iso運行時庫復制到Raspbian的默認庫位置:
?
root@raspberrypi4:~#?cp?/opt/hipSYCL/lib/libhipSYCL-rt.so?/usr/lib/libhipSYCL-rt.so
?7.設置環境變量,這是使用hipSYCL運行時庫和LLVM / Clang編譯器生成源代碼所必需的:?
export?PATH=$PATH:/opt/hipSYCL/bin
export?C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/include
export?CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/include
export?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/lib
echo?"export?PATH=$PATH:/opt/hipSYCL/bin"?>>?/root/.bashrc
echo?"export?C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/include"?>>?/root/.bashrc
echo?"export?CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/include"?>>?/root/.bashrc
echo?"export?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/lib"?>>?/root/.bashrc
env?PATH=$PATH:/opt/hipSYCL/bin
env?C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/include
env?CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/include
env?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/lib
??
在Raspberry Pi 4B +上的C ++ 17中運行并行CL / SYCL代碼
?
最后,我們終于完成了安裝和配置LLVM / Clang和hipSYCL庫的準備。強烈建議構建并運行“ matmul_hipsycl”示例的可執行文件,并確保一切工作正常: ?這是從來源構建以下樣本的最常用步驟: ?
rm?-rf?~/sources
mkdir?~/sources?&&?cd?~/sources
cp?~/matmul_hipsycl.tar.gz?~/sources/matmul_hipsycl.tar.gz
tar?-xvf?matmul_hipsycl.tar.gz
rm?-f?matmul_hipsycl.tar.gz
?一組先前的命令將創建?/ source子目錄,并從matmul_hipsycl.tar.gz實現中提取示例的源。
?要構建示例的可執行文件,只需使用GNU的“ make”命令:
?
root@raspberrypi4:~#?make?all
?這將調用“ clang ++”命令來生成可執行文件:
?
syclcc-clang?-O3?-std=c++17?-o?matrix_mul_rpi4?src/matrix_mul_rpi4b.cpp?-lstdc++
?此命令啟用最高級別的代碼優化(例如,-O3)來編譯特定的C ++ 17代碼,并將其與C ++標準庫運行時鏈接。
?注意:除了庫運行時以外,構建的hipSYCL項目還提供了“ syclcc”和“ syclcc-clang”工具。它們用于在C ++ 17中構建并行代碼,并使用hipSYCL庫實現。這些工具的使用與“ clang”和“ clang ++”命令的常規用法略有不同。但是,仍可以使用“ syclcc”和“ syclcc-clang”,并指定與原始“ clang”和“ clang ++”命令相同的編譯器和鏈接器選項。
?使用這些工具執行編譯之后,使用以下命令將執行權限授予由編譯器生成的“ matrix_mul_rpi4”文件:
?
root@raspberrypi4:~#?chmod?+rwx?matrix_mul_rpi4
?在bash控制臺中運行可執行文件:?
root@raspberrypi4:~#?./matrix_mul_rpi4
?運行它之后,執行將以以下輸出結束:?
*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*
Multiplication?C?=?A?x?B:
Matrix?C:
323?445?243?343?363?316?495?382?463?374
322?329?328?388?378?395?392?432?470?326
398?357?337?366?386?407?478?457?520?374
543?531?382?470?555?520?602?534?639?505
294?388?277?314?278?330?430?319?396?372
447?445?433?485?524?505?604?535?628?509
445?468?349?432?511?391?552?449?534?470
434?454?339?417?502?455?533?498?588?444
470?340?416?364?401?396?485?417?496?464
431?421?325?325?272?331?420?385?419?468
Execution?time:?5?ms
?(可選)我們可以通過安裝和使用以下實用程序來評估并行代碼的性能:?
root@raspberrypi4:~#?sudo?apt?install?-y?top?htop
?在運行并行代碼可執行文件時,已安裝的“ htop”實用程序的使用可直觀顯示CPU和系統內存的使用情況:
??
?
概要
?
微型FPGA,以及具有計算能力的袖珍GPGPU,通過GPIO或USB接口從外部連接到物聯網主板,是物聯網并行計算的下一步。微型FPGA和GPGPU的使用為執行更復雜、更“繁重”的計算提供了機會。同時,大幅提高實際性能加速,同時實時處理海量大數據。 ?顯然,物聯網并行計算的另一個重要方面是繼續開發特定的庫和框架,提供CL/SYCL模型層規范和異構計算平臺(XPU)支持。目前,這些庫的最新版本支持將并行代碼執行卸載到主機CPU加速目標。其他加速硬件,如用于納米計算機的小型GPGPU和FPGA,目前還沒有由其供應商設計和制造。 ?事實上,Raspberry Pi和其他特定物聯網主板的并行計算都是基于ARM Cortex-A72集群,64位。在與物聯網并行運行的同時,軟件開發人員和硬件技術人員對對現有計算過程進行性能評估的RISC CPU很感興趣。 ?總之,應用基于物聯網的并行計算通常會提高基于云的解決方案的整體性能。這些設備旨在實時收集和大規模處理大數據。其結果是,對機器學習(ML)和數據分析本身的質量產生了積極影響。 ?原文標題:基于ARMv8和AArch64硬件架構的物聯網板卡和納米計算機并行異構計算
文章出處:【微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
評論