为了对两个Cora Z7变种(其中只有一个是双核的)的处理器进行基准测试,我决定用SD卡上的Linux映像引导它们,并运行预编译的Go编程语言可执行程序。这款围棋应用程序会通过检查一个正方形内的大量随机点来估算圆周率,然后测试它们是否在一个内切的四分之一圆内。圆周率是由圆内的点数除以采样点的总数得到的。这种方法,被称为蒙特卡罗方法,是理想的并行化,因为对任何特定样本点的测试结果不依赖于对任何其他样本的测试结果。Go应用程序首先使用单线程方法估计Pi,然后再使用多线程方法。
Digilent为我们的一些板提供了PetaLinux图像,包括Cora板的两个变种Cor一个Z7-10和Cor一个Z7-07年代.关于如何使用这些项目的说明可以在上面的链接中找到。我需要使用运行Ubuntu 16.04.3的VirtualBox虚拟机Vivado 2017.4,PetaLinux工具,Golang安装。Golang可以通过apt-get安装,但其他工具需要通过Xilinx的网站下载。
我只需要将Cora手动挂载在Petalinux控制台中的microSD连接起来,就可以从我的计算机(在Cora的RAM中运行根文件系统)传输文件。从Cora到我的计算机的UART连接的速度也不是问题,所以我不需要使用以太网连接。然而,进一步的信息可在Petalinux回购的自述文件(Z7-10,Z7-07S)介绍如何安装Petalinux工具,通过以太网连接一个由Petalinux编程的板,并运行microSD的根文件系统。
使用Ubuntu内置的“磁盘”工具,我格式化了一个microSD卡,这样第一个分区是>500MB FAT,第二个分区是>20MB EXT4(实际上是3.5GB,剩余的SD卡存储空间)。
我创建了一个Go源文件,叫做“main”。go”(源代码在下面提供),并构建了一个应用程序,该应用程序可以在任意一个Cora变体上使用Linux终端中的“GOARCH=arm go build”命令运行。然后,我将输出可执行文件复制到microSD卡的第二个分区中。
然后,我下载了每个Coras的每个发布版bsp,可以通过它们的Github存储库获得(上面链接)。对于每个Cora,我使用repo的README中的说明创建了一个PetaLinux项目。然后复制预构建的图像。把Cora Z7-07S的ub和BOOT.BIN文件放到我的microSD卡的第一个分区。我将SD卡插入Cora Z7-07S,并设置Cora的跳线,使其通过USB接收电源,并从SD卡启动。我插上Cora,让PetaLinux启动,从一个Tera术语串行终端连接到Cora的USB-UART端口。一旦Cora启动,我就挂载microSD卡的第二个分区(位于Petalinux文件系统中的“/dev/mmcblk0p2”)并运行Go应用程序,通过命令行参数“100000”表示要测试的样本数量。我对Cora Z7-10重复了同样的过程。下面的图片是在每台Cora上运行Go应用程序后Tera Term终端的截图。
在多线程测试中,我预计Cora Z7-10的双核CPU需要的时间大约是单线程测试中处理样本所需时间的一半。
我原以为Cora Z7-07S的单核CPU在两次测试中需要相同的时间。由于管理多个线程需要一些额外的开销,因此多线程试验可能需要更多的时间。
Cora Z7-10和Z7-07S在单线程测试中所花费的时间是相同的,因为这两种主板的Zynq芯片的cpu具有相同的规格。
实际结果:下面的表格显示了每个科拉变种花了多长时间来处理10万个蒙特卡罗样本。
这工作得很好,我惊讶于Petalinux是多么容易设置。
我的同事Arvin Tang创建了另一个项目,他在裸金属FPGA设计中使用了相同的算法,每个时钟周期可以处理9个蒙特卡罗样本(每8纳秒一个时钟周期)。不出所料,他的结果比我的好得多,在不到一秒的时间内处理了五亿万个样本。(他的项目尚未发表)
评论