在物联网主板和创新的微型纳米计算机上,用C++++17和CL和SYCL编程模型规范构建并运行现代并行代码。这些处理器基于革命性的集群对称ARMCortex-A72CPU,采用ARMAArch64架构。
下面的博客文章提供了用C++17/2x0构建现代并行代码的实用指南、技巧和教程。它们使用CL/SYCL编程模型实施,并在基于创新的ARMCortex-A72、四核64位RISCCPU的下一代物联网主板上运行。
读者可以在AkselAlpay的hiSYCL库项目的开放源码发行版中找到用C++17编写的并行代码。另外,关于安装和配置LLVM和Clang-9.x.xARMAArch64-工具链,用于构建并行代码可执行文件并在功能强大的ARMCortex-A72CPU(采用ARMAArch64架构)上运行它。这篇博客文章主要关注在最新的RaspberryPI4B+板上构建和运行特定的并行代码可执行文件,这些板基于BroadcomBCM2711SoC芯片,专为嵌入式系统和物联网而设计
ARMCortex-A72CPU的树莓PI4B+物联网主板
2016年,ARM宣布发布革命性的新对称Cortex-A72CPU,配备64位ARMv8-这是一种硬件架构,完全支持大规模并行计算。这是物联网电路板和微型纳米计算机的下一个巨大时代,包括覆盆子PI4B+电路板。它们是为实时大规模收集和处理数据而设计的,作为嵌入式系统和物联网集群最重要的组成部分。
ARMCortex-A72CPU以1.8Ghz时钟频率和最新的LPDDR4-3200MhzRAM运行。根据SoC芯片和物联网主板型号的不同,它们的容量高达8GB。它们满足了从事高性能嵌入式系统和物联网集群设计的软件开发人员和系统工程师的期望。此外,针对特定的CPU型号和版本,Cortex-A72CPU具有革命性的高二级缓存容量,从512KiB到4MiB不等。
使用ARMCortex-A72的一个例子是Broadcom和RaspberryPi基础供应商制造创新的BCM2711SoC芯片和RaspberryPi4B+IoT板。
RaspberryPi板以“可靠”和“快速”的微型纳米计算机而闻名,这种微型计算机是专门为数据挖掘和并行计算而设计的。ARM集群对称64位RISC-CPU的主要新硬件架构特性(如DSP、SIMD、VFPv4和硬件虚拟化支持)显著提高了使用RaspberryPI进行大规模并行数据处理的性能、加速和可扩展性。
具体来说,基于ARMCortex-A72CPU和4GiB或更高内存的树莓PI是最适合物联网数据挖掘和并行计算的解决方案。此外,BCM2711B0SoC芯片还捆绑了各种集成设备和外围设备,如BroadcomVideoCoreVI@500MHzGPU、PCI-Ex千兆位以太网适配器等。
我们使用物联网进行并行计算所需要的只是一个RaspberryPI4B+。或者,任何其他基于ARMCortex-A72CPU和LPDDR4系统内存制造SoC芯片的物联网主板。
我们将演示如何设置一块树莓PI4B+电路板用于首次使用,开箱即用。
以下是预先满足的硬件和软件要求的简短核对表。
硬件:
RaspberryPI4型号B0,4GB物联网电路板。
用于Raspbian操作系统和数据存储的16GBMicro-SD卡。
直流电源:5.0V/2-3A,带USBC类连接器(最低3A-用于数据挖掘和并行计算)。
软件:
RaspbianBuster10.6.0完整操作系统。
Raspbian成像器1.4。
MobaXTerm20.3内部版本4396或任何其他SSH客户端
设置RaspberryPi4B物联网板
在开始之前,我们必须从官方RaspberryPi存储库下载最新版本的RaspbianBuster10.6.0完整OS映像。我们还需要下载并使用适用于各种平台(例如Windows,Linux或macOS)的RaspbianImager1.4应用程序。
RaspbianBuster10.6.0
http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2020-02-14/
RaspbianImager1.4
http://downloads.raspberrypi.org/imager/
另外,我们还必须下载并安装MobaXterm应用程序,以通过SSH或FTP协议远程建立与RaspberryPi板的连接:
MobaXterm20.3
https://mobaxterm.mobatek.net/download.html
由于已经成功下载并安装了RaspbianBusterOS和Imager应用程序,因此我们正在使用Imager应用程序执行以下操作:
默认情况下,擦除SD卡,将其格式化为FAT32文件系统
将预安装的RaspbianBusterOS映像(*.img)提取到SD卡中
由于成功完成了前面的步骤,因此请从读卡器中取出SD卡,然后将其插入RaspberryPi板的SD卡插槽中。然后,连接微型HDMI和以太网电缆。最后,插入直流电源电缆的连接器,然后打开电路板。最后,系统在安装到SD卡的RaspbianBusterOS引导下启动,提示执行多个安装后步骤以对其进行首次配置。
由于电路板上电,因此请确保完成以下所有安装后步骤:
打开bash控制台并设置“root”密码
pi@raspberrypi4:~$sudopasswdroot
以“root”权限登录到Raspbianbash控制台
pi@raspberrypi4:~$sudo-s
使用以下命令升级Raspbian的Linux基本系统和固件
root@raspberrypi4:~#sudoaptupdateroot@raspberrypi4:~#sudoaptfull-upgraderoot@raspberrypi4:~#sudorpi-update
第一次重新启动系统
root@raspberrypi4:~#sudoshutdown-rnow
安装最新的Raspbian的引导程序并再次重新引导系统
root@raspberrypi4:~#sudorpi-eeprom-update-d-aroot@raspberrypi4:~#sudoshutdown-rnow
启动“raspi-config”设置工具
root@raspberrypi4:~#sudoraspi-config
使用“raspi-config”工具完成以下步骤
更新'raspi-config'工具:
*在启动时禁用Raspbian的桌面GUI:系统选项>>引导/自动登录>>控制台自动登录:*扩展SD卡上的根“/”分区大小:执行Raspbian安装后配置后,最后重新启动系统。重新启动后,将提示您登录。使用先前设置的“root”用户名和密码,以root用户权限登录到bash控制台。既然您已经成功登录,请在bash-console中使用以下命令从APT存储库安装许多软件包:
root@raspberrypi4:~#sudoapTInstall-ynet-toolsopenssh-server
这两个软件包是配置RaspberryPi的网络接口或OpenSSH服务器所必需的,以便使用MobaXterm通过SSH协议远程连接到开发板。通过修改/etc/network/interfaces来配置板的网络接口'eth0',例如:
autoeth0ifaceeth0inetstaTIcaddress192.168.87.100netmask255.255.255.0broadcast192.168.87.255gateway192.168.87.254nameserver192.168.87.254
在网络接口旁边,通过取消注释/etc/ssh/sshd_config中的以下行来执行OpenSSH服务器的基本配置:
PermitRootLoginyesStrictModesnoPasswordAuthenTIcaTIonyesPermitEmptyPasswordsyes
这样就可以使用SSH协议以root身份登录到bash控制台,而无需输入密码。最后,尝试使用MobaXterm应用程序通过网络连接板,并打开到IP地址为192.168.87.100的主机的远程SSH会话。您还必须能够使用先前设置的凭据成功登录Raspbian的bash控制台。
使用CL/SYCL模型在C++17中开发并行代码
2020年,Khronos集团宣布了革命性的新型异构异构计算平台(XPU)。这提供了将“繁重”数据处理工作负载的执行卸载到仅主机CPU以外的大量硬件加速目标(例如GPGPU或FPGA)的能力。从概念上讲,使用XPU平台进行的并行代码开发完全基于KhronosCL/SYCL编程模型规范,该规范是OpenCL2.0库的抽象层。这是一个小示例,说明了使用CL/SYCL模型抽象层实现的C++17代码。
#includeusingnamespacecl::sycl;constexprstd::uint32_tN=1000;cl::queueq{};q.submit([&](cl::handler&cgh){cgh.parallel_for(cl::range<1>{N},[=](cl::id<1>idx){//Dosomeworkinparallel});});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年,德国海德堡大学AkselAlpay实施了最新的CL/SYCL编程模型层规格库。它针对的是硬件架构,包括RaspberryPi的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
在使用AkselAlpay的hipSYCL库项目的发行版之前,必须正确安装和配置特定的LLVM/Clang-9.xx编译器和Arm/AArch64工具链。为此,请确保您已完成以下步骤。1.更新Raspbian的APT存储库并安装以下必备软件包:
root@raspberrypi4:~#sudoaptupdateroot@raspberrypi4:~#sudoaptinstall-ybisonflexpythonpython3snapsnapdgitwget
前面的命令将安装备用的“快照”软件包管理器。这是安装正确版本的cmake>=3.18.0实用程序以及'python','python3'发行版和'bison','flex'实用程序所必需的。通过使用'cmake'实用程序,从头开始构建hipSYCL开源项目需要所有这些。2.使用'snap'软件包管理器安装'cmake'>=3.18.0实用程序和LLVM/Clang守护程序:
root@raspberrypi4:~#sudosnapinstallcmake--classicroot@raspberrypi4:~#sudosnapinstallclangd--classic
安装'cmake'实用程序后,让我们使用以下命令检查它是否有效,并且已经从'snap'存储库中安装了正确的版本:
root@raspberrypi4:~#sudocmake--version
运行此命令后,您必须看到以下输出:
cmakeversion3.18.4CMakesuitemaintainedandsupportedbyKitware(kitware.com/cmake).
3.为LLVM/Clang工具链安装最新的Boost,POSIX-Threads和C/C++标准运行时库:
root@raspberrypi4:~#sudoaptinstall-ylibc++-devlibc++1libc++abi-devlibc++abi1libpthread-stubs0-devlibpthread-workqueue-devroot@raspberrypi4:~#sudoaptinstall-yclang-formatclang-tidyclang-toolsclanglibc++-devlibc++1libc++abi-devlibc++abi1libclang-devlibclang1liblldb-devlibllvm-ocaml-devlibomp-devlibomp5lldlldbllvm-devllvm-runtimellvmpython-clanglibboost-all-dev
4.下载并添加LLVM/Clang的APT存储库安全密钥:
root@raspberrypi4:~#wget-O–https://apt.llvm.org/llvm-snapshot.gpg.key|sudoapt-keyadd–
5.将LLVM/Clang的存储库URL附加到APT的源列表中:
root@raspberrypi4:~#echo«debhttp://apt.llvm.org/buster/llvm-toolchain-bustermain»>>/etc/apt/sources.list.d/raspi.listroot@raspberrypi4:~#echo«deb-srchttp://apt.llvm.org/buster/llvm-toolchain-bustermain»>>/etc/apt/sources.list.d/raspi.list
为了能够从特定的APT存储库安装LLVM/Clang-9.xx编译器和特定的工具链,必须完成上述两个步骤4和5。6.删除到已安装的LLVM/Clang早期版本的现有符号链接:
root@raspberrypi4:~#cd/usr/bin&&rm-fclangclang++
7.再次更新APT存储库,并安装LLVM/Clang的编译器,调试器和链接器:
root@raspberrypi4:~#sudoaptupdateroot@raspberrypi4:~#sudoaptinstall-yclang-9lldb-9lld-9
8.创建到已安装的'clang-9'和'clang++-9'编译器的相应符号链接:
root@raspberrypi4:~#cd/usr/bin&&ln-sclang-9clangroot@raspberrypi4:~#cd/usr/bin&&ln-sclang++-9clang++
9.最后,您必须具备在bash控制台中使用'clang'和'clang++'命令的能力:
root@raspberrypi4:~#clang–version&&clang++--version
在这里,让我们使用前面的命令检查已安装的LLVM/Clang版本。
使用命令后,必须看到以下输出:
clangversion9.0.1-6+rpi1~bpo10+1Target:armv6k-unknown-linux-gnueabihfThreadmodel:posixInstalledDir:/usr/binclangversion9.0.1-6+rpi1~bpo10+1Target:armv6k-unknown-linux-gnueabihfThreadmodel:posixInstalledDir:/usr/bin
下载并构建hipSYCL库发行版
另一个必不可少的步骤是从其源代码下载并构建开放源代码的hipSYCL库分段发布,这对GitHub有所贡献。通常通过完成以下步骤来完成:
1.下载hipSYCL项目的发行版,从GitHub克隆它:
root@raspberrypi4:~#gitclonehttps://github.com/llvm/llvm-projectllvm-projectroot@raspberrypi4:~#gitclone--recurse-submoduleshttps://github.com/illuhad/hipSYCL
AkselAlpay的hipSYCL项目的发行版与另一个LLVM/Clang的开源项目有多个依赖关系。这就是为什么,我们通常需要克隆这两个发行版,以便从头开始构建hipSYCL库运行时。2.通过使用'export'和'env'命令设置从源代码构建hipSYCL项目所需的环境变量的数量,并将以下特定行附加到.bashrc配置文件脚本中:
exportLLVM_INSTALL_PREFIX=/usrexportLLVM_DIR=~/llvm-project/llvmexportCLANG_EXECUTABLE_PATH=/usr/bin/clang++exportCLANG_INCLUDE_PATH=$LLVM_INSTALL_PREFIX/include/clang/9.0.1/includeecho"exportLLVM_INSTALL_PREFIX=/usr">>/root/.bashrcecho"exportLLVM_DIR=~/llvm-project/llvm">>/root/.bashrcecho"exportCLANG_EXECUTABLE_PATH=/usr/bin/clang++">>/root/.bashrcecho"exportCLANG_INCLUDE_PATH=$LLVM_INSTALL_PREFIX/include/clang/9.0.1/include">>/root/.bashrcenvLLVM_INSTALL_PREFIX=/usrenvLLVM_DIR=~/llvm-project/llvmenvCLANG_EXECUTABLE_PATH=/usr/bin/clang++envCLANG_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)&&makeinstall-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编译器生成源代码所必需的:
exportPATH=$PATH:/opt/hipSYCL/binexportC_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/includeexportCPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/includeexportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/libecho"exportPATH=$PATH:/opt/hipSYCL/bin">>/root/.bashrcecho"exportC_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/include">>/root/.bashrcecho"exportCPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/include">>/root/.bashrcecho"exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/lib">>/root/.bashrcenvPATH=$PATH:/opt/hipSYCL/binenvC_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/hipSYCL/includeenvCPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/hipSYCL/includeenvLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/hipSYCL/lib
在RaspberryPi4B+上的C++17中运行并行CL/SYCL代码
最后,我们终于完成了安装和配置LLVM/Clang和hipSYCL库的准备。强烈建议构建并运行“matmul_hipsycl”示例的可执行文件,并确保一切工作正常:这是从来源构建以下样本的最常用步骤:
rm-rf~/sourcesmkdir~/sources&&cd~/sourcescp~/matmul_hipsycl.tar.gz~/sources/matmul_hipsycl.tar.gztar-xvfmatmul_hipsycl.tar.gzrm-fmatmul_hipsycl.tar.gz
一组先前的命令将创建〜/source子目录,并从matmul_hipsycl.tar.gz实现中提取示例的源。要构建示例的可执行文件,只需使用GNU的“make”命令:
root@raspberrypi4:~#makeall
这将调用“clang++”命令来生成可执行文件:
syclcc-clang-O3-std=c++17-omatrix_mul_rpi4src/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+rwxmatrix_mul_rpi4
在bash控制台中运行可执行文件:
root@raspberrypi4:~#./matrix_mul_rpi4
运行它之后,执行将以以下输出结束:
***************************************MultiplicationC=AxB:MatrixC:323445243343363316495382463374322329328388378395392432470326398357337366386407478457520374543531382470555520602534639505294388277314278330430319396372447445433485524505604535628509445468349432511391552449534470434454339417502455533498588444470340416364401396485417496464431421325325272331420385419468Executiontime:5ms
(可选)我们可以通过安装和使用以下实用程序来评估并行代码的性能:
root@raspberrypi4:~#sudoaptinstall-ytophtop
在运行并行代码可执行文件时,已安装的“htop”实用程序的使用可直观显示CPU和系统内存的使用情况:
概要
微型FPGA,以及具有计算能力的袖珍GPGPU,通过GPIO或USB接口从外部连接到物联网主板,是物联网并行计算的下一步。微型FPGA和GPGPU的使用为执行更复杂、更“繁重”的计算提供了机会。同时,大幅提高实际性能加速,同时实时处理海量大数据。显然,物联网并行计算的另一个重要方面是继续开发特定的库和框架,提供CL/SYCL模型层规范和异构计算平台(XPU)支持。目前,这些库的最新版本支持将并行代码执行卸载到主机CPU加速目标。其他加速硬件,如用于纳米计算机的小型GPGPU和FPGA,目前还没有由其供应商设计和制造。事实上,RaspberryPi和其他特定物联网主板的并行计算都是基于ARMCortex-A72集群,64位。在与物联网并行运行的同时,软件开发人员和硬件技术人员对对现有计算过程进行性能评估的RISCCPU很感兴趣。总之,应用基于物联网的并行计算通常会提高基于云的解决方案的整体性能。这些设备旨在实时收集和大规模处理大数据。其结果是,对机器学习(ML)和数据分析本身的质量产生了积极影响。
文章出处:安芯教育科技