資料介紹
描述
我們的目標...
該項目提供了有用的指南、技巧和教程,用于在 C++17/2x0 中構(gòu)建現(xiàn)代并行代碼,使用 CL/SYCL 編程模型實現(xiàn),并在下一代 Raspberry Pi 4B IoT 板上運行它,基于創(chuàng)新ARM Cortex-A72,四核,64 位 RISC-V CPU。
讀者將了解如何設(shè)置開箱即用的 Raspberry 4B IoT 板,并將其用于并行計算,使用 Khronos CL/triSYCL 和 Aksel Alpay 提供 C++17 并行代碼hipSYCL 項目的開源發(fā)行版,安裝和配置 GNU 的編譯器集合 (GCC) 和 LLVM/Clang-9.xx Arm/Aarch64-工具鏈,用于構(gòu)建并行代碼的可執(zhí)行文件并在 Raspbian Buster 10.6 OS 中運行。
Raspberry PI 4B+ 物聯(lián)網(wǎng)板概述
下一代創(chuàng)新的 Raspberry Pi 4B+ IoT 板基于強大的 ARM 多核對稱 64 位 RISC-V CPU,提供了釋放的性能,從而實現(xiàn)并行計算的終極生產(chǎn)力。使用最新的 Raspberry Pi 板可以顯著提高邊緣計算過程的實際性能加速,例如在將數(shù)據(jù)交付到數(shù)據(jù)中心進行處理之前實時收集和預(yù)處理數(shù)據(jù),例如-規(guī)模。這些流程的并行運行顯著提高了這些基于云的解決方案的效率,為數(shù)十億的客戶請求提供服務(wù)或提供數(shù)據(jù)分析和其他推理。
在我們開始討論在 C++17 中構(gòu)建和運行并行代碼之前,使用 CL/SYCL 異構(gòu)編程模型規(guī)范為具有 Arm/Aarch64 架構(gòu)的 Raspberry Pi 板設(shè)計,讓我們花點時間花點時間瀏覽下一代 Raspberry Pi 4B+ 板及其技術(shù)規(guī)格:
Raspberry Pi 4B+ IoT 板基于創(chuàng)新的 Broadcom BCM2711B0 (SoC) 芯片制造,配備最新的 ARM 四核 Cortex-A72 @ 1.5GHz 64 位 RISC-V CPU,提供終極性能和可擴展性,同時利用它用于邊緣的并行計算。
Raspberry Pi 以“可靠”和“快速”的微型納米計算機而聞名,專為數(shù)據(jù)挖掘和并行計算而設(shè)計。ARM 的多核對稱 64 位 RISC-V CPU 的主要新硬件架構(gòu)特性,如 DSP、SIMD、VFPv4 和硬件虛擬化支持,能夠顯著提高性能、加速速度和可擴展性。物聯(lián)網(wǎng)集群,在邊緣大規(guī)模處理數(shù)據(jù)。
具體來說,最新的 Raspberry Pi 4B+ 板最重要的優(yōu)勢之一是具有 2、4 或 8 GiB RAM 容量選擇的薄型 LPDDR4 內(nèi)存,以 3200Mhz 運行并提供典型的大內(nèi)存事務(wù)帶寬,對性能產(chǎn)生積極影響一般來說,并行計算。強烈推薦安裝 4 GiB 或更高 RAM 的板卡用于數(shù)據(jù)挖掘和并行計算。此外,BCM2711B0 SoC 芯片與各種集成設(shè)備和外圍設(shè)備捆綁在一起,例如 Broadcom VideoCore VI @ 500Mhz GPU、PCI-Ex 千兆以太網(wǎng)適配器等。
為了在 C++17 中構(gòu)建和運行特定的并行現(xiàn)代代碼,使用 CL/SYCL 異構(gòu)編程模型實現(xiàn),我們真正需要的第一個是安裝和配置最新 Raspbian Buster 10.6 OS 的 Raspberry Pi 4B+ IoT 板第一次使用。
以下是必須事先滿足的硬件和軟件要求的簡要清單:
硬件:
- 樹莓派 4 型號 B0,4GB 物聯(lián)網(wǎng)板;
- 用于 Raspbian 操作系統(tǒng)和數(shù)據(jù)存儲的 16GB 微型 SD 卡;
- 直流電源:5.0V/2-3A,通過 USB Type-C 連接器(最低 3A - 用于數(shù)據(jù)挖掘和并行計算);
軟件:
- Raspbian Buster 10.6.0 完整操作系統(tǒng);
- Raspbian Imager 1.4;
- MobaXterm 20.3 build 4396 或任何其他 SSH 客戶端;
因為,我們有一個 Raspberry Pi 4B+ IoT 板,現(xiàn)在,我們可以繼續(xù)打開它并進行設(shè)置,開箱即用。
設(shè)置 Raspberry Pi 4B 物聯(lián)網(wǎng)板
在開始之前,我們必須從官方 Raspberry Pi 存儲庫下載最新版本的 Raspbian Buster 10.6.0 Full OS 映像。要將 Raspbian OS 映像安裝到 SD 卡,我們還需要下載并使用 Raspbian Imager 1.4 應(yīng)用程序,該應(yīng)用程序可用于各種平臺,例如 Windows、Linux 或 macOS:
此外,我們還必須下載并安裝 MobaXterm 應(yīng)用程序,以通過 SSH 或 FTP 協(xié)議遠程建立與 Raspberry Pi 板的連接:
由于 Raspbian Buster OS 和 Imager 應(yīng)用程序已成功下載并安裝,我們將使用 Imager 應(yīng)用程序執(zhí)行以下操作:
1. 擦除SD卡,默認格式化為FAT32文件系統(tǒng);
2. 將預(yù)裝的 Raspbian Buster OS 鏡像 (*.img) 解壓到 SD 卡中;
由于上述步驟已成功完成,只需從讀卡器中取出 SD 卡并將其插入樹莓派板的 SD 卡插槽即可。然后,連接 micro-HDMI 和以太網(wǎng)電纜。最后,插入直流電源線的連接器,然后打開電路板。最后,系統(tǒng)將使用安裝到 SD 卡的 Raspbian Buster OS 啟動,提示執(zhí)行幾個安裝后步驟來配置它以供首次使用。
由于開發(fā)板已上電,請確保已完成以下所有安裝后步驟:
1. 打開 bash 控制臺并設(shè)置“root”密碼:
pi@raspberrypi4:~ $ sudo passwd root
2. 使用“root”權(quán)限登錄 Raspbian bash 控制臺:
pi@raspberrypi4:~ $ sudo -s
3. 使用以下命令升級 Raspbian 的 Linux 基礎(chǔ)系統(tǒng)和固件:
root@raspberrypi4:~# sudo apt update
root@raspberrypi4:~# sudo apt full-upgrade
root@raspberrypi4:~# sudo rpi-update
4. 重新啟動系統(tǒng),第一次:
root@raspberrypi4:~# sudo shutdown -r now
5. 安裝最新的 Raspbian 的引導程序并重新啟動系統(tǒng),再次:
root@raspberrypi4:~# sudo rpi-eeprom-update -d -a
root@raspberrypi4:~# sudo shutdown -r now
6. 啟動“raspi-config”設(shè)置工具:
root@raspberrypi4:~# sudo raspi-config
7. 使用“raspi-config”工具完成以下步驟:
* 更新 'raspi-config' 工具:
* 在啟動時禁用 Raspbian 的桌面 GUI:
系統(tǒng)選項>>引導/自動登錄>>控制臺自動登錄:
* 擴展 SD 卡上的根 '/' 分區(qū)大?。?/font>
執(zhí)行 Raspbian 安裝后配置后,最后重新啟動系統(tǒng)。重新啟動后,系統(tǒng)會提示您登錄。使用之前設(shè)置的“root”用戶名和密碼,以 root 權(quán)限登錄 bash 控制臺。
由于您已成功登錄,請在 bash-console 中使用以下命令從 APT-repositories 安裝包的數(shù)量:
root@raspberrypi4:~# sudo apt install -y net-tools openssh-server
這兩個軟件包是配置 Raspberry Pi 的網(wǎng)絡(luò)接口或 OpenSSH 服務(wù)器以使用 MobaXterm 通過 SSH 協(xié)議遠程連接到開發(fā)板所必需的。
通過修改 /etc/network/interfaces 來配置板子的網(wǎng)絡(luò)接口 '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
在網(wǎng)絡(luò)接口旁邊,通過取消注釋/etc/ssh/sshd_config中的這些行來執(zhí)行 OpenSSH 服務(wù)器的基本配置:
PermitRootLogin yes
StrictModes no
PasswordAuthentication yes
PermitEmptyPasswords yes
這將啟用“root”登錄,通過 SSH 協(xié)議進入 bash 控制臺,而無需輸入密碼。
最后,嘗試通過網(wǎng)絡(luò)連接開發(fā)板,使用 MobaXterm 應(yīng)用程序并打開與 IP 地址為:192.168.87.100 的主機的遠程 SSH 會話。您還必須能夠使用先前設(shè)置的憑據(jù)成功登錄到 Raspbian 的 bash 控制臺:
使用 CL/SYCL-Model 在 C++17 中開發(fā)并行代碼
2020 年,Khronos Group、英特爾公司和其他供應(yīng)商宣布推出革命性的新型異構(gòu)并行計算平臺 (XPU),能夠?qū)ⅰ胺敝亍睌?shù)據(jù)處理工作負載的執(zhí)行卸載到廣泛的硬件加速(例如 GPGPU 或FPGAs) 目標,而不是主機 CPU。從概念上講,使用 XPU 平臺的并行代碼開發(fā)完全基于 Khronos CL/SYCL 編程模型規(guī)范——OpenCL 2.0 庫的抽象層。
這是一個小例子,展示了 C++17 中的代碼,使用 CL/SYCL 模型抽象層實現(xiàn):
#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 編程模型交付。它使用默認參數(shù)初始化器列表實例化一個 cl::sycl::queue{} 對象,用于提交 SYCL 內(nèi)核、執(zhí)行、主機 CPU 加速目標,默認使用。接下來,它調(diào)用 cl::sycl::submit(...) 方法,具有 cl::sycl::handler{} 對象的單個參數(shù),用于訪問提供基本內(nèi)核功能的方法,基于各種并行算法,包括 cl::sycl::handler::parallel_for(...) 方法。
以下方法用于實現(xiàn)緊密的并行循環(huán),從正在運行的內(nèi)核中產(chǎn)生。此循環(huán)的每次迭代都由其自己的線程并行執(zhí)行。cl::sycl::handler::parallel_for(...) 接受 cl::sycl::range<>{} 對象的兩個主要參數(shù)和在每次循環(huán)迭代期間調(diào)用的特定 lamda 函數(shù)。cl::sycl::range<>{} 對象基本上為每個特定維度定義了并行循環(huán)迭代的數(shù)量,以防多個嵌套循環(huán)被折疊,同時處理多維數(shù)據(jù)。
在上面的代碼中,cl::sycl::range<1>(N) 對象用于在一維中調(diào)度并行循環(huán)的 N 次迭代。parallel_for(...) 方法的 lambda 函數(shù)接受另一個 cl::sycl::id<>{} 對象的單個參數(shù)。與 cl::sycl::range<>{} 一樣,該對象實現(xiàn)了一個向量容器,其中每個元素分別是并行循環(huán)的每個維度和每次迭代的索引值。作為參數(shù)傳遞給 lamda 函數(shù)范圍內(nèi)的代碼,以下對象用于檢索特定索引值。lamda 函數(shù)的主體包含一個代碼,它可以并行執(zhí)行一些數(shù)據(jù)處理。
在將特定內(nèi)核提交到隊列并生成執(zhí)行后,以下代碼會調(diào)用不帶參數(shù)的 cl::sycl::wait() 方法來設(shè)置屏障同步,以確保到目前為止不會執(zhí)行任何代碼,直到生成的內(nèi)核完成其并行工作。
CL/SYCL異構(gòu)編程模型效率高,可用于廣泛的應(yīng)用。
但是,英特爾公司和 CodePlay 軟件公司很快就棄用了對 x86_64 以外的硬件架構(gòu)的 CL/SYCL 支持。這使得使用特定 CL/SYCL 庫、針對 Arm/Aarch64 和其他架構(gòu)的并行 C++ 代碼變得不可能。
目前有大量的CL/SYCL開源庫項目,由廣大開發(fā)者和愛好者開發(fā),提供對更多硬件架構(gòu)的支持,而不僅僅是x86_64。
自 2016 年以來,Khronos Group, Inc. 發(fā)布了其 triSYCL 庫開源項目 ( https://github.com/triSYCL/triSYCL) 的修訂版,建議在評估最新的 CL/SYCL 編程模型層時將其用作測試平臺規(guī)范并向 Khronos 和 ISO 委員會發(fā)送反饋。但是,以下庫分發(fā)不是“穩(wěn)定的”,只能用于演示目的,而不是用于在生產(chǎn)中構(gòu)建 CL/SYCL 代碼。此外,Khronos triSYCL 庫發(fā)行版完全支持跨平臺編譯,在 x86_64 開發(fā)機器上,使用 GNU 的 Arm/Aarch64 跨平臺工具鏈,而不是在 Raspberry 上使用 LLVM/Clang 編譯器“本地”構(gòu)建代碼皮。
2019 年,海德堡大學(德國)的 Aksel Alpay 實現(xiàn)了最新的 CL/SYCL 編程模型層規(guī)范庫,針對各種硬件架構(gòu),包括 Raspberry Pi 的 Arm/Aarch64 架構(gòu),并貢獻了最“穩(wěn)定”的版本將 hipSYCL 開源庫分發(fā)到 GitHub ( https://github.com/illuhad/hipSYCL )。
此外,在這個故事中,我們將討論安裝和配置 GNU 的跨平臺 GCC/G++-10.xx 和“本機”Arm/Aarch64 的 LLVM/Clang-9.xx 工具鏈,以及使用 triSYCL 和 hipSYCL 庫發(fā)行版,用于在 C++17 中交付現(xiàn)代并行代碼,基于使用庫,正在討論中。
在 Debian/Ubuntu 開發(fā)機 (x86_64) 和 Raspberry Pi IoT-Boards 上構(gòu)建 CL/SYCL 代碼
基本上有兩種構(gòu)建 CL/SYCL 代碼的方法,在上面介紹的 C++17 中,使用 GNU 的 GCC/G++-10.xx 跨平臺工具鏈和基于 x86_64 Debian/Ubuntu 的開發(fā)機器,或者, “本地”,在 Raspberry Pi IoT 板上,安裝了用于 Arm/Aarch64 硬件架構(gòu)的 LLVM/Clang-9.xx。
第一種方法的使用允許在基于 Debian/Ubuntu 的 x86_64 開發(fā)機器上使用 Khronos triSYCL 庫和 GNU 的跨平臺 Arm/Aarch64-toolchain 構(gòu)建 C++17/2x0 代碼源,之前在 Raspberry Pi 上運行它。
要部署 x86_64 開發(fā)機器,需要安裝最新的 Debian Buster 10.6.0 或 Ubuntu 20.04 LTS:
為了能夠在運行 Microsoft Windows 10 的主機上使用開發(fā)機器,可以使用任何現(xiàn)有的(例如 Oracle VirtualBox 或 VMware Workstation)虛擬化環(huán)境,用于此目的:
要開始部署開發(fā)機器,首先要做的是設(shè)置特定的虛擬化環(huán)境,創(chuàng)建虛擬機并啟動 Debian 或 Ubuntu 安裝。
既然已經(jīng)創(chuàng)建了虛擬機,并且成功安裝了 Debian/Ubuntu,我們可以繼續(xù)進行幾個步驟,安裝和配置 GNU 的 GCC/G++-10.xx 跨平臺編譯器、開發(fā)工具和 Khronos triSYCL 庫,構(gòu)建代碼所必需的,針對 Raspberry Pi 的 Arm/Aarch64 架構(gòu)。
在安裝和配置 GCC/G++ 編譯器工具鏈和運行時庫之前,請確保已完成以下先決步驟:
- 升級 Debian/Ubuntu 的 Linux 基礎(chǔ)系統(tǒng):
root@uarmhf64-dev:~# sudo apt update
root@uarmhf64-dev:~# sudo apt upgrade -y
root@uarmhf64-dev:~# sudo apt full-upgrade -y
需要完成此步驟,以確保在 x86_64 主機開發(fā)機器上運行的 Debian/Ubuntu 安裝是最新的,并且安裝了最新的內(nèi)核和軟件包。
- 從 APT-repository 安裝 'net-tools' 和 OpenSSH-server 軟件包:
root@uarmhf64-dev:~# sudo apt install -y net-tools openssh-server
安裝“net-tools”和“openssh-server”是為了提供配置開發(fā)機器的網(wǎng)絡(luò)接口并通過 SSH 和 FTP 協(xié)議遠程連接到正在運行的開發(fā)機器的能力。
由于系統(tǒng)已經(jīng)升級并安裝了所有必需的軟件包,我們可以繼續(xù)安裝和配置特定的編譯器和工具鏈,然后。
安裝和配置 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 開發(fā)機器上構(gòu)建使用 triSYCL 庫的 C++17 并行代碼基本上需要安裝用于 Arm64/Armhf 硬件架構(gòu)的跨平臺工具鏈。
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 跨平臺編譯器,用于構(gòu)建代碼,針對 Arm64/Armhf 架構(gòu):
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 庫分發(fā):
root@uarmhf64-dev:~# cd /opt
root@uarmhf64-dev:~# git clone --recurse-submodules https://github.com/triSYCL/triSYCL
以下命令將創(chuàng)建 /opt/triSYCL 子目錄,其中包含 triSYCL 庫分發(fā)的源代碼。
9. 使用 'rsync' 命令將 triSYCL 庫的 C++ 頭文件從 /opt/triSYCL/include 目錄復制到開發(fā)機器上的默認位置 /usr/include/c++/10/:
root@uarmhf64-dev:~# cd /opt/triSYCL
root@uarmhf64-dev:~# sudo rsync -r ./ include/ /usr/include/c++/10/
10. 設(shè)置環(huán)境變量,將 triSYCL 庫與 GNU 的跨平臺工具鏈一起使用所需的環(huán)境變量,之前已安裝:
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 子目錄執(zhí)行簡單的清理:
root@uarmhf64-dev:~# rm -rf /opt/triSYCL
12. 使用“本機”x86_64 GNU 的 GCC/G++ 編譯器構(gòu)建“hello.cpp”代碼示例:
root@uarmhf64-dev:~# g++ -std=c++17 -o hello hello.cpp -lpthread -lstdc++
使用 Khronos triSYCL 庫的 C++17/2x0 中的構(gòu)建特定代碼需要 POSIX 線程和 C++ 標準庫運行時鏈接。
13. 使用 GNU 的跨平臺 GCC/G++ 編譯器構(gòu)建“hello.cpp”代碼示例:
root@uarmhf64-dev:~# arm-linux-gnueabihf-g++ -std=c++17 -o hello_rpi4b hello.cpp -lpthread -lstdc++
由于 Arm/Aarch64 架構(gòu)的可執(zhí)行代碼已成功生成,請使用 MobaXterm 應(yīng)用程序通過 FTP 或 SSH 協(xié)議從開發(fā)機器下載可執(zhí)行文件。之后,使用另一個 SSH 會話將“hello_rpi4b”可執(zhí)行文件上傳到 Raspberry Pi 板。
要運行“hello_rpi4b”可執(zhí)行文件,請在 Raspbian 的 bash 控制臺中使用以下命令,例如:
root@uarmhf64-dev:~# chmod +rwx hello_rpi4b
root@uarmhf64-dev:~# ./hello_rpi4b > output.txt && cat output.txt
這將創(chuàng)建輸出并將其附加到“output.txt”文件,將其內(nèi)容打印到 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+!!!
注意:通常,第一種方法不需要從其源構(gòu)建 Khronos triSYCL 庫分發(fā),除非您計劃針對其他 HPC 庫使用 triSYCL,例如 OpenCL、OpenMP 或 TBB。有關(guān)使用 triSYCL 以及其他庫的更多信息,請參閱以下指南和文檔https://github.com/triSYCL/triSYCL/blob/master/doc/cmake.rst
使用 Aksel Alpay 的 hipSYCL 開源庫分發(fā)和 LLVM/Clang-9.xx “本機”編譯器工具鏈,針對 Arm/Aarch64 架構(gòu),是第二種方法,允許在 C 中構(gòu)建 CL/SYCL 代碼++17/2x0,用于在 Raspberry Pi 板上運行它。只有在 LLVM/Clang-9.xx 工具鏈和 hipSYCL 庫發(fā)行版都安裝在 Raspberry Pi 板上而不是 x86_64 開發(fā)機器本身上的情況下,才能在本地構(gòu)建特定代碼。
此外,我們將討論在 Raspberry Pi 板上安裝和配置 LLVM/Clang-9.xx 編譯器工具鏈以及從源代碼構(gòu)建 Aksel Alpay 的 hipSYCL 庫所需了解的一切。
安裝和配置 LLVM/Clang-9.xx
在使用 Aksel Alpay 的 hipSYCL 庫項目的分發(fā)之前,必須正確安裝和配置特定的 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' 發(fā)行版和 'bison'、'flex ' 實用程序,需要使用“cmake”實用程序從“頭開始”構(gòu)建 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 版本的現(xiàn)有符號鏈接:
root@raspberrypi4:~# cd /usr/bin && rm -f clang clang++
7. 再次更新 APT 存儲庫,并安裝 LLVM/Clang 的編譯器、調(diào)試器和鏈接器:
root@raspberrypi4:~# sudo apt update
root@raspberrypi4:~# sudo apt install -y clang-9 lldb-9 lld-9
8. 創(chuàng)建到 'clang-9' 和 'clang++-9' 編譯器的相應(yīng)符號鏈接,安裝:
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
下載和構(gòu)建 hipSYCL 庫分發(fā)
另一個重要步驟是從其源代碼下載并構(gòu)建開源 hipSYCL 庫暫存發(fā)行版,并貢獻給 GitHub。
這通常通過完成以下步驟來完成,如下所示:
1. 下載 hipSYCL 項目的發(fā)行版,從 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 項目的發(fā)行版有幾個依賴于另一個 LLVM/Clang 的開源項目。這就是為什么,我們通常需要克隆這兩個發(fā)行版,以便從“零開始”構(gòu)建 hipSYCL 庫運行時。
2. 使用“export”和“env”命令設(shè)置從源代碼構(gòu)建 hipSYCL 項目所需的環(huán)境變量數(shù)量,并將以下特定行附加到 .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. 創(chuàng)建并切換到 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”命令構(gòu)建和安裝 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. 設(shè)置使用 hipSYCL 運行時庫和 LLVM/Clang 編譯器構(gòu)建源代碼所需的環(huán)境變量:
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 庫的準備工作,強烈建議構(gòu)建和運行“matmul_hipsycl”示例的可執(zhí)行文件,確保一切正常:
以下是從源代碼構(gòu)建以下示例的最常見步驟:
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
上面的一組命令將創(chuàng)建 ~/source 子目錄并從 matmul_hipsycl.tar.gz 檔案中提取樣本的源代碼。
要構(gòu)建示例的可執(zhí)行文件,只需使用 GNU 的“make”命令:
root@raspberrypi4:~# make all
這將調(diào)用“clang++”命令來構(gòu)建可執(zhí)行文件:
syclcc-clang -O3 -std=c++17 -o matrix_mul_rpi4 src/matrix_mul_rpi4b.cpp -lstdc++
此命令將編譯具有最高代碼優(yōu)化級別(例如 -O3)的特定 C++17 代碼,啟用并將其與 C++ 標準庫運行時鏈接。
注意:除了庫運行時,構(gòu)建的 hipSYCL 項目還提供了“syclcc”和“syclcc-clang”工具,用于在 C++17 中構(gòu)建并行代碼,使用 hipSYCL 庫實現(xiàn)。這些工具的使用與“clang”和“clang++”命令的常規(guī)使用略有不同。但是,仍然可以使用“syclcc”和“syclcc-clang”,指定與原始“clang”和“clang++”命令相同的編譯器和鏈接器選項。
使用這些工具執(zhí)行編譯后,只需將執(zhí)行權(quán)限授予編譯器生成的“matrix_mul_rpi4”文件,使用以下命令:
root@raspberrypi4:~# chmod +rwx matrix_mul_rpi4
,并且,只需在 bash 控制臺中運行可執(zhí)行文件:
root@raspberrypi4:~# ./matrix_mul_rpi4
運行后,執(zhí)行將得到以下輸出:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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
或者,我們可以評估并行代碼的性能,通過安裝和使用以下實用程序來執(zhí)行:
root@raspberrypi4:~# sudo apt install -y top htop
在運行并行代碼可執(zhí)行文件時,使用已安裝的“htop”實用程序可視化 CPU 和系統(tǒng)內(nèi)存利用率:
綜上所述...
微型 FPGA 以及具有計算能力的袖珍型 GPGPU,通過 GPIO 或 USB 接口從外部連接到物聯(lián)網(wǎng)板,是物聯(lián)網(wǎng)并行計算的下一個巨大步驟。使用微型 FPGA 和 GPGPU 提供了一個機會,可以并行執(zhí)行更復雜和“繁重”的計算,從而大大提高實際性能加速,同時實時處理大量大數(shù)據(jù)。
顯然,物聯(lián)網(wǎng)并行計算的另一個重要方面是繼續(xù)開發(fā)特定的庫和框架,提供 CL/SYCL 模型層規(guī)范,從而支持異構(gòu)計算平臺 (XPU)。目前,這些庫的最新版本支持將并行代碼執(zhí)行卸載到主機 CPU 加速目標,只是因為尚未設(shè)計其他加速硬件,例如用于納米計算機的小型 GPGPU 和 FPGA并由其供應(yīng)商在此時制造。
事實上,使用 Raspberry Pi 和其他特定 IoT 板進行并行計算是軟件開發(fā)人員和硬件技術(shù)人員的一個特殊興趣點,對現(xiàn)有計算過程進行性能評估,同時與 IoT 并行運行。
總之,利用基于物聯(lián)網(wǎng)的并行計算通常有利于基于云的解決方案的整體性能,旨在實時收集和大規(guī)模處理大數(shù)據(jù),從而對機器學習的質(zhì)量產(chǎn)生積極影響(ML) 和數(shù)據(jù)分析本身。
- Windows IoT和Raspberry Pi:讀取按鈕
- Raspberry Pi 4上帶Respeaker的離線語音識別
- 在Raspberry Pi Pico上連接Wi-Fi變得容易
- 適用于Raspberry Pi 4的Raspberry Pi Pico開發(fā)板
- 樹莓派Raspberry Pi 3 Model B+的電路原理圖免費下載 179次下載
- 樹莓派Raspberry Pi 4 Model B的電路原理圖免費下載 409次下載
- 樹莓派Raspberry Pi 3 Model B的電路原理圖免費下載 187次下載
- 樹莓派Raspberry Pi4 B型的電路原理圖免費下載 388次下載
- C編程的并行計算詳細資料說明
- CUDA的異構(gòu)并行計算詳細資料介紹
- 如何使用Web在Java上進行并行計算的資料說明 6次下載
- 基于云計算的電磁問題并行計算方法 1次下載
- raspberry_pi各版本差別 0次下載
- 并行計算和嵌入式系統(tǒng)實踐教程 48次下載
- 基于MPI并行計算的信號稀疏分解
- 5分鐘內(nèi)將Raspberry Pi Pico變成簡單的示波器+波形發(fā)生器 1522次閱讀
- 使用Raspberry Pi Pico W和MicroPython開發(fā)物聯(lián)網(wǎng)應(yīng)用 1673次閱讀
- 用于測試項目的4個最佳樹莓派Raspberry Pi模擬器 5985次閱讀
- 如何使用Raspberry Pi使熱水浴缸變得智能和遠程操作 1813次閱讀
- 基于樹莓派產(chǎn)品 Raspberry Pi微控制器板的優(yōu)缺點 2710次閱讀
- 如何從Raspberry Pi Pico的模數(shù)轉(zhuǎn)換器捕獲數(shù)據(jù)計算? 2580次閱讀
- 微雪電子ZeroW| Raspberry Pi ZeroW主板簡介 2429次閱讀
- 微雪電子Raspberry Pi 3 Model主板簡介 2873次閱讀
- 微雪電子Raspberry Pi 3 ModelB主板簡介 2884次閱讀
- 微雪電子Raspberry Pi 3 Model擴展板簡介 1512次閱讀
- 微雪電子樹莓派4代B|Raspberry Pi主板介紹 6116次閱讀
- 基于Raspberry Pi 3 Model B+的掌上游戲機介紹 4905次閱讀
- 一文了解Raspberry Pi 4各項性能跑分 2.9w次閱讀
- 基于異構(gòu)并行計算的兩個子概念異構(gòu)和并行的簡單分析 6466次閱讀
- 并行計算和分布式計算的區(qū)別和聯(lián)系 3.5w次閱讀
下載排行
本周
- 1美的電磁爐維修手冊大全
- 1.56 MB | 5次下載 | 5 積分
- 2SMD LED選型手冊 貼片燈珠
- 5.47 MB | 3次下載 | 免費
- 3基于PLC的拉絲機張力控制系統(tǒng)研究
- 0.14 MB | 2次下載 | 5 積分
- 4加密芯片的一種破解方法和對應(yīng)加密方案改進設(shè)計
- 0.29 MB | 1次下載 | 免費
- 5萬用表UT58A原理圖
- 0.09 MB | 1次下載 | 5 積分
- 6多功能MPU芯片GC9005數(shù)據(jù)手冊
- 2.67 MB | 1次下載 | 免費
- 7面向NXP i.MX8處理器的電源解決方案
- 47.47KB | 次下載 | 免費
- 8LP8733-Q1和LP8732-Q1為DRA78x和TDA3x供電的用戶指南
- 61.31KB | 次下載 | 免費
本月
- 1使用單片機實現(xiàn)七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 2UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 20次下載 | 免費
- 3華瑞昇CR216芯片數(shù)字萬用表規(guī)格書附原理圖及校正流程方法
- 0.74 MB | 14次下載 | 3 積分
- 4DMT0660數(shù)字萬用表產(chǎn)品說明書
- 0.70 MB | 13次下載 | 免費
- 53314A函數(shù)發(fā)生器維修手冊
- 16.30 MB | 13次下載 | 免費
- 6TPS54202H降壓轉(zhuǎn)換器評估模塊用戶指南
- 1.02MB | 9次下載 | 免費
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8感應(yīng)筆電路圖
- 0.06 MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多