資料介紹
描述
我們的目標...
該項目提供了有用的指南、技巧和教程,用于在 C++17/2x0 中構建現代并行代碼,使用 CL/SYCL 編程模型實現,并在下一代 Raspberry Pi 4B IoT 板上運行它,基于創新ARM Cortex-A72,四核,64 位 RISC-V CPU。
讀者將了解如何設置開箱即用的 Raspberry 4B IoT 板,并將其用于并行計算,使用 Khronos CL/triSYCL 和 Aksel Alpay 提供 C++17 并行代碼hipSYCL 項目的開源發行版,安裝和配置 GNU 的編譯器集合 (GCC) 和 LLVM/Clang-9.xx Arm/Aarch64-工具鏈,用于構建并行代碼的可執行文件并在 Raspbian Buster 10.6 OS 中運行。
Raspberry PI 4B+ 物聯網板概述
下一代創新的 Raspberry Pi 4B+ IoT 板基于強大的 ARM 多核對稱 64 位 RISC-V CPU,提供了釋放的性能,從而實現并行計算的終極生產力。使用最新的 Raspberry Pi 板可以顯著提高邊緣計算過程的實際性能加速,例如在將數據交付到數據中心進行處理之前實時收集和預處理數據,例如-規模。這些流程的并行運行顯著提高了這些基于云的解決方案的效率,為數十億的客戶請求提供服務或提供數據分析和其他推理。
在我們開始討論在 C++17 中構建和運行并行代碼之前,使用 CL/SYCL 異構編程模型規范為具有 Arm/Aarch64 架構的 Raspberry Pi 板設計,讓我們花點時間花點時間瀏覽下一代 Raspberry Pi 4B+ 板及其技術規格:
Raspberry Pi 4B+ IoT 板基于創新的 Broadcom BCM2711B0 (SoC) 芯片制造,配備最新的 ARM 四核 Cortex-A72 @ 1.5GHz 64 位 RISC-V CPU,提供終極性能和可擴展性,同時利用它用于邊緣的并行計算。
Raspberry Pi 以“可靠”和“快速”的微型納米計算機而聞名,專為數據挖掘和并行計算而設計。ARM 的多核對稱 64 位 RISC-V CPU 的主要新硬件架構特性,如 DSP、SIMD、VFPv4 和硬件虛擬化支持,能夠顯著提高性能、加速速度和可擴展性。物聯網集群,在邊緣大規模處理數據。
具體來說,最新的 Raspberry Pi 4B+ 板最重要的優勢之一是具有 2、4 或 8 GiB RAM 容量選擇的薄型 LPDDR4 內存,以 3200Mhz 運行并提供典型的大內存事務帶寬,對性能產生積極影響一般來說,并行計算。強烈推薦安裝 4 GiB 或更高 RAM 的板卡用于數據挖掘和并行計算。此外,BCM2711B0 SoC 芯片與各種集成設備和外圍設備捆綁在一起,例如 Broadcom VideoCore VI @ 500Mhz GPU、PCI-Ex 千兆以太網適配器等。
為了在 C++17 中構建和運行特定的并行現代代碼,使用 CL/SYCL 異構編程模型實現,我們真正需要的第一個是安裝和配置最新 Raspbian Buster 10.6 OS 的 Raspberry Pi 4B+ IoT 板第一次使用。
以下是必須事先滿足的硬件和軟件要求的簡要清單:
硬件:
- 樹莓派 4 型號 B0,4GB 物聯網板;
- 用于 Raspbian 操作系統和數據存儲的 16GB 微型 SD 卡;
- 直流電源:5.0V/2-3A,通過 USB Type-C 連接器(最低 3A - 用于數據挖掘和并行計算);
軟件:
- Raspbian Buster 10.6.0 完整操作系統;
- Raspbian Imager 1.4;
- MobaXterm 20.3 build 4396 或任何其他 SSH 客戶端;
因為,我們有一個 Raspberry Pi 4B+ IoT 板,現在,我們可以繼續打開它并進行設置,開箱即用。
設置 Raspberry Pi 4B 物聯網板
在開始之前,我們必須從官方 Raspberry Pi 存儲庫下載最新版本的 Raspbian Buster 10.6.0 Full OS 映像。要將 Raspbian OS 映像安裝到 SD 卡,我們還需要下載并使用 Raspbian Imager 1.4 應用程序,該應用程序可用于各種平臺,例如 Windows、Linux 或 macOS:
此外,我們還必須下載并安裝 MobaXterm 應用程序,以通過 SSH 或 FTP 協議遠程建立與 Raspberry Pi 板的連接:
由于 Raspbian Buster OS 和 Imager 應用程序已成功下載并安裝,我們將使用 Imager 應用程序執行以下操作:
1. 擦除SD卡,默認格式化為FAT32文件系統;
2. 將預裝的 Raspbian Buster OS 鏡像 (*.img) 解壓到 SD 卡中;
由于上述步驟已成功完成,只需從讀卡器中取出 SD 卡并將其插入樹莓派板的 SD 卡插槽即可。然后,連接 micro-HDMI 和以太網電纜。最后,插入直流電源線的連接器,然后打開電路板。最后,系統將使用安裝到 SD 卡的 Raspbian Buster OS 啟動,提示執行幾個安裝后步驟來配置它以供首次使用。
由于開發板已上電,請確保已完成以下所有安裝后步驟:
1. 打開 bash 控制臺并設置“root”密碼:
pi@raspberrypi4:~ $ sudo passwd root
2. 使用“root”權限登錄 Raspbian bash 控制臺:
pi@raspberrypi4:~ $ sudo -s
3. 使用以下命令升級 Raspbian 的 Linux 基礎系統和固件:
root@raspberrypi4:~# sudo apt update
root@raspberrypi4:~# sudo apt full-upgrade
root@raspberrypi4:~# sudo rpi-update
4. 重新啟動系統,第一次:
root@raspberrypi4:~# sudo shutdown -r now
5. 安裝最新的 Raspbian 的引導程序并重新啟動系統,再次:
root@raspberrypi4:~# sudo rpi-eeprom-update -d -a
root@raspberrypi4:~# sudo shutdown -r now
6. 啟動“raspi-config”設置工具:
root@raspberrypi4:~# sudo raspi-config
7. 使用“raspi-config”工具完成以下步驟:
* 更新 'raspi-config' 工具:
* 在啟動時禁用 Raspbian 的桌面 GUI:
系統選項>>引導/自動登錄>>控制臺自動登錄:
* 擴展 SD 卡上的根 '/' 分區大小:
執行 Raspbian 安裝后配置后,最后重新啟動系統。重新啟動后,系統會提示您登錄。使用之前設置的“root”用戶名和密碼,以 root 權限登錄 bash 控制臺。
由于您已成功登錄,請在 bash-console 中使用以下命令從 APT-repositories 安裝包的數量:
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
這將啟用“root”登錄,通過 SSH 協議進入 bash 控制臺,而無需輸入密碼。
最后,嘗試通過網絡連接開發板,使用 MobaXterm 應用程序并打開與 IP 地址為:192.168.87.100 的主機的遠程 SSH 會話。您還必須能夠使用先前設置的憑據成功登錄到 Raspbian 的 bash 控制臺:
使用 CL/SYCL-Model 在 C++17 中開發并行代碼
2020 年,Khronos Group、英特爾公司和其他供應商宣布推出革命性的新型異構并行計算平臺 (XPU),能夠將“繁重”數據處理工作負載的執行卸載到廣泛的硬件加速(例如 GPGPU 或FPGAs) 目標,而不是主機 CPU。從概念上講,使用 XPU 平臺的并行代碼開發完全基于 Khronos CL/SYCL 編程模型規范——OpenCL 2.0 庫的抽象層。
這是一個小例子,展示了 C++17 中的代碼,使用 CL/SYCL 模型抽象層實現:
#include <CL/sycl.hpp>
using namespace cl::sycl;
constexpr std::uint32_t N = 1000;
cl::sycl::queue q{};
q.submit([&](cl::sycl::handler &cgh) {
cgh.parallel_for<class Kernel>(cl::sycl::range<1>{N}, \
[=](cl::sycl::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<1>(N) 對象用于在一維中調度并行循環的 N 次迭代。parallel_for(...) 方法的 lambda 函數接受另一個 cl::sycl::id<>{} 對象的單個參數。與 cl::sycl::range<>{} 一樣,該對象實現了一個向量容器,其中每個元素分別是并行循環的每個維度和每次迭代的索引值。作為參數傳遞給 lamda 函數范圍內的代碼,以下對象用于檢索特定索引值。lamda 函數的主體包含一個代碼,它可以并行執行一些數據處理。
在將特定內核提交到隊列并生成執行后,以下代碼會調用不帶參數的 cl::sycl::wait() 方法來設置屏障同步,以確保到目前為止不會執行任何代碼,直到生成的內核完成其并行工作。
CL/SYCL異構編程模型效率高,可用于廣泛的應用。
但是,英特爾公司和 CodePlay 軟件公司很快就棄用了對 x86_64 以外的硬件架構的 CL/SYCL 支持。這使得使用特定 CL/SYCL 庫、針對 Arm/Aarch64 和其他架構的并行 C++ 代碼變得不可能。
目前有大量的CL/SYCL開源庫項目,由廣大開發者和愛好者開發,提供對更多硬件架構的支持,而不僅僅是x86_64。
自 2016 年以來,Khronos Group, Inc. 發布了其 triSYCL 庫開源項目 ( https://github.com/triSYCL/triSYCL) 的修訂版,建議在評估最新的 CL/SYCL 編程模型層時將其用作測試平臺規范并向 Khronos 和 ISO 委員會發送反饋。但是,以下庫分發不是“穩定的”,只能用于演示目的,而不是用于在生產中構建 CL/SYCL 代碼。此外,Khronos triSYCL 庫發行版完全支持跨平臺編譯,在 x86_64 開發機器上,使用 GNU 的 Arm/Aarch64 跨平臺工具鏈,而不是在 Raspberry 上使用 LLVM/Clang 編譯器“本地”構建代碼皮。
2019 年,海德堡大學(德國)的 Aksel Alpay 實現了最新的 CL/SYCL 編程模型層規范庫,針對各種硬件架構,包括 Raspberry Pi 的 Arm/Aarch64 架構,并貢獻了最“穩定”的版本將 hipSYCL 開源庫分發到 GitHub ( https://github.com/illuhad/hipSYCL )。
此外,在這個故事中,我們將討論安裝和配置 GNU 的跨平臺 GCC/G++-10.xx 和“本機”Arm/Aarch64 的 LLVM/Clang-9.xx 工具鏈,以及使用 triSYCL 和 hipSYCL 庫發行版,用于在 C++17 中交付現代并行代碼,基于使用庫,正在討論中。
在 Debian/Ubuntu 開發機 (x86_64) 和 Raspberry Pi IoT-Boards 上構建 CL/SYCL 代碼
基本上有兩種構建 CL/SYCL 代碼的方法,在上面介紹的 C++17 中,使用 GNU 的 GCC/G++-10.xx 跨平臺工具鏈和基于 x86_64 Debian/Ubuntu 的開發機器,或者, “本地”,在 Raspberry Pi IoT 板上,安裝了用于 Arm/Aarch64 硬件架構的 LLVM/Clang-9.xx。
第一種方法的使用允許在基于 Debian/Ubuntu 的 x86_64 開發機器上使用 Khronos triSYCL 庫和 GNU 的跨平臺 Arm/Aarch64-toolchain 構建 C++17/2x0 代碼源,之前在 Raspberry Pi 上運行它。
要部署 x86_64 開發機器,需要安裝最新的 Debian Buster 10.6.0 或 Ubuntu 20.04 LTS:
為了能夠在運行 Microsoft Windows 10 的主機上使用開發機器,可以使用任何現有的(例如 Oracle VirtualBox 或 VMware Workstation)虛擬化環境,用于此目的:
要開始部署開發機器,首先要做的是設置特定的虛擬化環境,創建虛擬機并啟動 Debian 或 Ubuntu 安裝。
既然已經創建了虛擬機,并且成功安裝了 Debian/Ubuntu,我們可以繼續進行幾個步驟,安裝和配置 GNU 的 GCC/G++-10.xx 跨平臺編譯器、開發工具和 Khronos triSYCL 庫,構建代碼所必需的,針對 Raspberry Pi 的 Arm/Aarch64 架構。
在安裝和配置 GCC/G++ 編譯器工具鏈和運行時庫之前,請確保已完成以下先決步驟:
- 升級 Debian/Ubuntu 的 Linux 基礎系統:
root@uarmhf64-dev:~# sudo apt update
root@uarmhf64-dev:~# sudo apt upgrade -y
root@uarmhf64-dev:~# sudo apt full-upgrade -y
需要完成此步驟,以確保在 x86_64 主機開發機器上運行的 Debian/Ubuntu 安裝是最新的,并且安裝了最新的內核和軟件包。
- 從 APT-repository 安裝 'net-tools' 和 OpenSSH-server 軟件包:
root@uarmhf64-dev:~# sudo apt install -y net-tools openssh-server
安裝“net-tools”和“openssh-server”是為了提供配置開發機器的網絡接口并通過 SSH 和 FTP 協議遠程連接到正在運行的開發機器的能力。
由于系統已經升級并安裝了所有必需的軟件包,我們可以繼續安裝和配置特定的編譯器和工具鏈,然后。
安裝和配置 GNU 的 GCC/G++-10.xx
1. 安裝 GNU Compilers Collection (GCC) 的工具鏈,用于 x86_64 平臺:
root@uarmhf64-dev:~# sudo apt install -y build-essential
2. 安裝 GNU 的跨平臺 Arm64/Armhf 工具鏈:
root@uarmhf64-dev:~# sudo apt install -y crossbuild-essential-arm64
root@uarmhf64-dev:~# sudo apt install -y crossbuild-essential-armhf
在 x86_64 開發機器上構建使用 triSYCL 庫的 C++17 并行代碼基本上需要安裝用于 Arm64/Armhf 硬件架構的跨平臺工具鏈。
3. 安裝 GNU 的 GCC/G++、OpenMP 5.0、Boost、Range-v3、POSIX Threads、C/C++ 標準運行時庫,需要:
root@uarmhf64-dev:~# sudo apt install -y g++-10 libomp-dev libomp5 libboost-all-dev librange-v3-dev libc++-dev libc++1 libc++abi-dev libc++abi1 libpthread-stubs0-dev libpthread-workqueue-dev
4. 安裝 GNU 的 GCC/G++-10.xx 跨平臺編譯器,用于構建代碼,針對 Arm64/Armhf 架構:
root@uarmhf64-dev:~# sudo apt install -y gcc-10-arm-linux-gnueabi g++-10-arm-linux-gnueabi gcc-10-arm-linux-gnueabihf g++-10-arm-linux-gnueabihf
5. 選擇默認使用的 GCC/G++-10.xx “native” x86_64 編譯器,更新備選方案:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 2
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 1
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 2
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 3
sudo update-alternatives --set cc /usr/bin/gcc
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 3
sudo update-alternatives --set c++ /usr/bin/g++
6. 選擇默認使用的 GCC/G++-10.xx 跨平臺 Arm/Aarch64 編譯器,更新備選方案:
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-9 1
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-10 2
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-9 1
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-10 2
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-cc arm-linux-gnueabihf-cc /usr/bin/arm-linux-gnueabihf-gcc 3
sudo update-alternatives --set arm-linux-gnueabihf-cc /usr/bin/arm-linux-gnueabihf-gcc
sudo update-alternatives --install /usr/bin/arm-linux-gnueabihf-c++ arm-linux-gnueabihf-c++ /usr/bin/arm-linux-gnueabihf-g++ 3
sudo update-alternatives --set arm-linux-gnueabihf-c++ /usr/bin/arm-linux-gnueabihf-g++
7. 最后,檢查是否安裝了正確版本的 GNU 的“本機”和跨平臺工具鏈:
root@uarmhf64-dev:~# gcc --version && g++ --version
root@uarmhf64-dev:~# arm-linux-gnueabihf-gcc --version
root@uarmhf64-dev:~# arm-linux-gnueabihf-g++ --version
8. 導航到 /opt 目錄并從 GitHub 存儲庫克隆 Khronos triSYCL 庫分發:
root@uarmhf64-dev:~# cd /opt
root@uarmhf64-dev:~# git clone --recurse-submodules https://github.com/triSYCL/triSYCL
以下命令將創建 /opt/triSYCL 子目錄,其中包含 triSYCL 庫分發的源代碼。
9. 使用 'rsync' 命令將 triSYCL 庫的 C++ 頭文件從 /opt/triSYCL/include 目錄復制到開發機器上的默認位置 /usr/include/c++/10/:
root@uarmhf64-dev:~# cd /opt/triSYCL
root@uarmhf64-dev:~# sudo rsync -r ./ include/ /usr/include/c++/10/
10. 設置環境變量,將 triSYCL 庫與 GNU 的跨平臺工具鏈一起使用所需的環境變量,之前已安裝:
export CPLUS_INCLUDE_PATH=/usr/include/c++/10
env CPLUS_INCLUDE_PATH=/usr/include/c++/10
sudo echo "export CPLUS_INCLUDE_PATH=/usr/include/c++/10" >> /root/.bashrc
11. 通過刪除 /opt/triSYCL 子目錄執行簡單的清理:
root@uarmhf64-dev:~# rm -rf /opt/triSYCL
12. 使用“本機”x86_64 GNU 的 GCC/G++ 編譯器構建“hello.cpp”代碼示例:
root@uarmhf64-dev:~# g++ -std=c++17 -o hello hello.cpp -lpthread -lstdc++
使用 Khronos triSYCL 庫的 C++17/2x0 中的構建特定代碼需要 POSIX 線程和 C++ 標準庫運行時鏈接。
13. 使用 GNU 的跨平臺 GCC/G++ 編譯器構建“hello.cpp”代碼示例:
root@uarmhf64-dev:~# arm-linux-gnueabihf-g++ -std=c++17 -o hello_rpi4b hello.cpp -lpthread -lstdc++
由于 Arm/Aarch64 架構的可執行代碼已成功生成,請使用 MobaXterm 應用程序通過 FTP 或 SSH 協議從開發機器下載可執行文件。之后,使用另一個 SSH 會話將“hello_rpi4b”可執行文件上傳到 Raspberry Pi 板。
要運行“hello_rpi4b”可執行文件,請在 Raspbian 的 bash 控制臺中使用以下命令,例如:
root@uarmhf64-dev:~# chmod +rwx hello_rpi4b
root@uarmhf64-dev:~# ./hello_rpi4b > output.txt && cat output.txt
這將創建輸出并將其附加到“output.txt”文件,將其內容打印到 bash 控制臺:
Hello from triSYCL on Rasberry Pi 4B+!!!
Hello from triSYCL on Rasberry Pi 4B+!!!
Hello from triSYCL on Rasberry Pi 4B+!!!
Hello from triSYCL on Rasberry Pi 4B+!!!
Hello from triSYCL on Rasberry Pi 4B+!!!
注意:通常,第一種方法不需要從其源構建 Khronos triSYCL 庫分發,除非您計劃針對其他 HPC 庫使用 triSYCL,例如 OpenCL、OpenMP 或 TBB。有關使用 triSYCL 以及其他庫的更多信息,請參閱以下指南和文檔https://github.com/triSYCL/triSYCL/blob/master/doc/cmake.rst
使用 Aksel Alpay 的 hipSYCL 開源庫分發和 LLVM/Clang-9.xx “本機”編譯器工具鏈,針對 Arm/Aarch64 架構,是第二種方法,允許在 C 中構建 CL/SYCL 代碼++17/2x0,用于在 Raspberry Pi 板上運行它。只有在 LLVM/Clang-9.xx 工具鏈和 hipSYCL 庫發行版都安裝在 Raspberry Pi 板上而不是 x86_64 開發機器本身上的情況下,才能在本地構建特定代碼。
此外,我們將討論在 Raspberry Pi 板上安裝和配置 LLVM/Clang-9.xx 編譯器工具鏈以及從源代碼構建 Aksel Alpay 的 hipSYCL 庫所需了解的一切。
安裝和配置 LLVM/Clang-9.xx
在使用 Aksel Alpay 的 hipSYCL 庫項目的分發之前,必須正確安裝和配置特定的 LLVM/Clang-9.xx 編譯器和 Arm/Aarch64 工具鏈。為此,請確保您已完成下列步驟:
1. 更新 Raspbian 的 APT-repositories 并安裝以下必備軟件包:
root@raspberrypi4:~# sudo apt update
root@raspberrypi4:~# sudo apt install -y bison flex python python3 snap snapd git wget
上面的命令將安裝一個替代的 'snap' 包管理器,安裝正確版本的 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'-repository 安裝了正確的版本:
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-repositories 安全密鑰:
root@raspberrypi4:~# wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
5. 將 LLVM/Clang 的存儲庫 URL 附加到 APT 的 sources.list:
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
必須完成前面的這兩個步驟 4 和 5,才能從特定的 APT 存儲庫安裝 LLVM/Clang-9.xx 編譯器和特定工具鏈。
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-console 中使用“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 和其他特定 IoT 板進行并行計算是軟件開發人員和硬件技術人員的一個特殊興趣點,對現有計算過程進行性能評估,同時與 IoT 并行運行。
總之,利用基于物聯網的并行計算通常有利于基于云的解決方案的整體性能,旨在實時收集和大規模處理大數據,從而對機器學習的質量產生積極影響(ML) 和數據分析本身。
- Windows IoT和Raspberry Pi:讀取按鈕
- Raspberry Pi 4上帶Respeaker的離線語音識別
- 在Raspberry Pi Pico上連接Wi-Fi變得容易
- 適用于Raspberry Pi 4的Raspberry Pi Pico開發板
- CRC校驗碼并行計算的FPGA實現 30次下載
- 樹莓派Raspberry Pi 4 Model B的電路原理圖免費下載 427次下載
- 樹莓派Raspberry Pi4 B型的電路原理圖免費下載 402次下載
- C編程的并行計算詳細資料說明
- CUDA的異構并行計算詳細資料介紹
- 如何使用Web在Java上進行并行計算的資料說明 6次下載
- 基于云計算的電磁問題并行計算方法 1次下載
- raspberry_pi各版本差別 0次下載
- 并行計算和嵌入式系統實踐教程 48次下載
- 基于MPI并行計算的信號稀疏分解
- 可擴展并行計算技術、結構與編程
- 5分鐘內將Raspberry Pi Pico變成簡單的示波器+波形發生器 2318次閱讀
- 使用Raspberry Pi Pico W和MicroPython開發物聯網應用 2180次閱讀
- 用于測試項目的4個最佳樹莓派Raspberry Pi模擬器 6823次閱讀
- 如何使用Raspberry Pi使熱水浴缸變得智能和遠程操作 1985次閱讀
- 基于樹莓派產品 Raspberry Pi微控制器板的優缺點 2984次閱讀
- 如何從Raspberry Pi Pico的模數轉換器捕獲數據計算? 2772次閱讀
- 微雪電子ZeroW| Raspberry Pi ZeroW主板簡介 2618次閱讀
- 微雪電子Raspberry Pi 3 Model主板簡介 3145次閱讀
- 微雪電子Raspberry Pi 3 Model擴展板簡介 1667次閱讀
- 微雪電子樹莓派4代B|Raspberry Pi主板介紹 6488次閱讀
- 基于Raspberry Pi 3 Model B+的掌上游戲機介紹 5153次閱讀
- 一文了解Raspberry Pi 4各項性能跑分 3w次閱讀
- 基于異構并行計算的兩個子概念異構和并行的簡單分析 6630次閱讀
- 成為一名并行異構并行計算工程師需要掌握的技能詳解 6632次閱讀
- 并行計算和分布式計算的區別和聯系 3.6w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多