作为一个接触HPC不久的菜鸡,前些时间被老板要求熟悉一下Parboil,在此途中遇到了一些奇奇怪怪的问题。本想求助于网络,奈何网上关于Parboil的教程较少,只能自己硬着头皮去寻找方法。现在好歹是搞定了,便想着记录一下,看看能不能帮到和我遇到同样问题的小伙伴们。
有两个途径可以获取到Parboil,github 或I MPACT 下载页
1. github
下载地址:https://github.com/abduld/Parboil.git
优点:基本所有的文件都布局好了,解压后加上datasets就能用。
缺点:缺少datasets
2. IMPACT
下载地址:http://impact.crhc.illinois.edu/parboil/parboil_download_page.aspx
优点:提供datasets下载
缺点:需要分开下载datasets, drivers和benchmarks,下载后还要按Readme进行布局
个人建议直接clone一下github上的文件,再到IMPACT下载数据集,放在根目录。
布局好后,根目录应该有这些文件和文件夹
benchmarks里面放着各种测试算法,common里放着各种平台的Makefile文件,datasets里放着数据集,driver里有着定义Parboil的执行逻辑的代码。三个README建议大家好好看一下,里面讲了最基本的文件结构和使用方法。
1.编译
(1)首先进入common文件夹,里面有对应设备的一些Makefile examples。这里我主要使用的是cuda和opencl,所以复制了Makefile.conf.example-nvidia,将其改名为Makefile.conf,并根据本机目录设置好路径。
(2)设置好路径后,打开终端,cd到Parboil根目录,用 ./parboil + option的格式执行操作,例如我们这里先执行list命令,查看可用的benchmarks
(3)接下来我们尝试一下编译,以lbm为例,先打开benchmarks/lbm/src目录,在这里可以看到lbm对应各种工具的代码文件夹
接着我们开始编译,指令格式为 ./parboil compile benchmark_name platform,例如我要编译N卡opencl版本的代码,就在终端输入 ./parboil compile lbm opencl_nvidia
编译成功后,我们回到lbm根目录,这时可以看到多了一个build文件夹,一路点进去可以看到生成的.o文件
(2)运行
要正确地运行,首先我们要搞清楚对应的benchmark有几个版本的数据集。点开datasets里lbm的对应文件夹,可以看到有
long和short两个版本.如果我们要在short数据集上运行,指令就是 ./parboil run opencl_nvidia short。运行成功后,parboil会根据output文件夹的标准输出进行对比,一致则输出pass
这里简单介绍下笔主使用Parboil踩过的一些坑,以及最后是怎么解决的。有的方法可能不适用于所有设备,如有错误,还望网友们批评指正。
1. ./parboil list时,遇到assert instance(bmkdir,pdf.Directory)错误
这中情况说明你的数据集不全,有的benchmark在datasets文件夹找不到对应的文件。由于在IMPACT主页上下载的数据集没有涵盖所有的benchmarks,很容易遇到这个错误。
解决方法:1.补充缺失的benchmark数据集,如果你不需要所有benchmark的数据集,也可以不用管,毕竟它不会影响你对测试有datasets的benchmark。
2. 若运行opencl版本,记得先装好icc和libpm4
有的同学在运行opencl版本时,可能会遇到以下两个错误
(1)make: icc command not found
(2)can not open directory “perfmon/pfmlib_perf_event.h”
解决方法:前者是缺少了icc,后者是缺少了libpm4库,安装之后问题就迎刃而解了
3. 运行cuda版本时,出现 "recipe for target ‘run’ failed"错误
首先我们找到对应的cuda.mk,第90行,经过调试,发现是ldd $(BIN) | grep cuda除了问题
个人认为,这里是对链接的库文件的检查过程,首先ldd找出运行目录下的.o文件链接了那些库,再用grep检查是否含有cuda字样。然而,这种检查不一定是必要的。
解决方法: 将其注释掉后,cuda样例成功运行,结果pass。
1.建议使用Parboil前,读一下driver目录下的actions.py,里面有parboil各种指令的逻辑和定义格式,可以看到各个option后要跟几个参数,每个参数对应着什么,被传入了哪里。
2.使用root来执行指令,可以避免运行过程中生成文件的权限问题。不过要注意环境变量的变化,可能需要把原用户的环境变量赋值也添加到root的.bashrc里。