啥都吃的豆芽 · 2020年12月09日

基于ARMv8和AArch64硬件架构的物联网板卡和纳米计算机并行异构计算

image.png

Arthur Ratz
2020年11月20日

在物联网主板和创新的微型纳米计算机上,用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应用程序。

另外,我们还必须下载并安装MobaXterm应用程序,以通过SSH或FTP协议远程建立与Raspberry Pi板的连接:

由于已经成功下载并安装了Raspbian Buster OS和Imager应用程序,因此我们正在使用Imager应用程序执行以下操作:

默认情况下,擦除SD卡,将其格式化为FAT32文件系统
将预安装的Raspbian Buster OS映像(* .img)提取到SD卡中
由于成功完成了前面的步骤,因此请从读卡器中取出SD卡,然后将其插入Raspberry Pi板的SD卡插槽中。然后,连接微型HDMI和以太网电缆。最后,插入直流电源电缆的连接器,然后打开电路板。最后,系统在安装到SD卡的Raspbian Buster OS引导下启动,提示执行多个安装后步骤以对其进行首次配置。

由于电路板上电,因此请确保完成以下所有安装后步骤:

  1. 打开bash控制台并设置“ root”密码
pi@raspberrypi4:~ $ sudo passwd root
  1. 以“ root”权限登录到Raspbian bash控制台
pi@raspberrypi4:~ $ sudo -s
  1. 使用以下命令升级Raspbian的Linux基本系统和固件
root@raspberrypi4:~# sudo apt update
root@raspberrypi4:~# sudo apt full-upgrade
root@raspberrypi4:~# sudo rpi-update
  1. 第一次重新启动系统
root@raspberrypi4:~# sudo shutdown -r now
  1. 安装最新的Raspbian的引导程序并再次重新引导系统
root@raspberrypi4:~# sudo rpi-eeprom-update -d -a
root@raspberrypi4:~# sudo shutdown -r now
  1. 启动“ raspi-config”设置工具
root@raspberrypi4:~# sudo raspi-config  
  1. 使用“ raspi-config”工具完成以下步骤
  • 更新'raspi-config'工具:

image.png

*在启动时禁用Raspbian的桌面GUI:
系统选项>>引导/自动登录>>控制台自动登录:
image.png

*扩展SD卡上的根“ /”分区大小:
image.png

执行Raspbian安装后配置后,最后重新启动系统。重新启动后,将提示您登录。使用先前设置的“ root”用户名和密码,以root用户权限登录到bash控制台。

既然您已经成功登录,请在bash-console中使用以下命令从APT存储库安装许多软件包:

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控制台。

image.png

使用CL / SYCL模型在C ++ 17中开发并行代码

2020年,Khronos集团宣布了革命性的新型异构异构计算平台(XPU)。这提供了将“繁重”数据处理工作负载的执行卸载到仅主机CPU以外的大量硬件加速目标(例如GPGPU或FPGA)的能力。从概念上讲,使用XPU平台进行的并行代码开发完全基于Khronos CL / SYCL编程模型规范,该规范是OpenCL 2.0库的抽象层。这是一个小示例,说明了使用CL / SYCL模型抽象层实现的C ++ 17代码。

#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(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/hi...

此外,我们还讨论了如何安装和配置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和系统内存的使用情况:

image.png

概要

微型FPGA,以及具有计算能力的袖珍GPGPU,通过GPIO或USB接口从外部连接到物联网主板,是物联网并行计算的下一步。微型FPGA和GPGPU的使用为执行更复杂、更“繁重”的计算提供了机会。同时,大幅提高实际性能加速,同时实时处理海量大数据。

显然,物联网并行计算的另一个重要方面是继续开发特定的库和框架,提供CL/SYCL模型层规范和异构计算平台(XPU)支持。目前,这些库的最新版本支持将并行代码执行卸载到主机CPU加速目标。其他加速硬件,如用于纳米计算机的小型GPGPU和FPGA,目前还没有由其供应商设计和制造。

事实上,Raspberry Pi和其他特定物联网主板的并行计算都是基于ARM Cortex-A72集群,64位。在与物联网并行运行的同时,软件开发人员和硬件技术人员对对现有计算过程进行性能评估的RISC CPU很感兴趣。

总之,应用基于物联网的并行计算通常会提高基于云的解决方案的整体性能。这些设备旨在实时收集和大规模处理大数据。其结果是,对机器学习(ML)和数据分析本身的质量产生了积极影响。

推荐阅读
关注数
23583
内容数
1033
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息