目录
背景
rodinia_3.1是一个GPU-CPU实验的benchmark(标杆),可以对openmp、opencl、cuda进行kmeans、hotspot等实验,但是其编译和运行却是相当费劲,以下是我从下载到运行的全过程记录,供大家参考
步骤
下载与解压
下载压缩包http://www.cs.virginia.edu/~kw5na/lava/Rodinia/Packages/Current/rodinia_3.1.tar.bz2,然后上传到ubuntu服务器,解压之
root@sundata:/data/szc# tar -jxvf rodinia_3.1.tar.bz2
确保自己安装了cuda、opencl for cuda(安装步骤请参见文章OpenCL与OpenACC的安装)、gcc7和g++7
修改与复制文件
我们要修改一些文件,配置一些路径,以及适配一下我的sm与compute结构
1、进入rodinia目录,修改common/make.config文件
root@sundata:/data/szc/rodinia_3.1# vim common/make.config
修改CUDA_DIR、SDK_DIR和OPENCL_DIR为自己的cuda目录、opencl目录下的C目录、opencl目录
# CUDA toolkit installation path
CUDA_DIR = /usr/local/cuda-10.0
# CUDA toolkit libraries
CUDA_LIB_DIR := $(CUDA_DIR)/lib
ifeq ($(shell uname -m), x86_64)
ifeq ($(shell if test -d $(CUDA_DIR)/lib64; then echo T; else echo F; fi), T)
CUDA_LIB_DIR := $(CUDA_DIR)/lib64
endif
endif
# CUDA SDK installation path
#SDK_DIR = $(HOME)/NVIDIA_GPU_Computing_SDK/C
SDK_DIR = /root/NVIDIA_GPU_Computing_SDK/C
#SDK_DIR =/if10/kw5na/NVIDIA_CUDA_Computing_SDK4/C
# OPENCL
# NVIDIA_DIR
OPENCL_DIR =/root/NVIDIA_GPU_Computing_SDK
OPENCL_INC = $(OPENCL_DIR)/OpenCL/common/inc
OPENCL_LIB = $(OPENCL_DIR)/OpenCL/common/lib -lOpenCL
# AMD_DIR
# OPENCL_DIR = /if10/kw5na/Packages/AMD-APP-SDK-v2.8-RC-lnx64
# OPENCL_INC = $(OPENCL_DIR)/include/
# OPENCL_LIB = $(OPENCL_DIR)/lib/x86_64/ -lOpenCL
#ifeq ($(shell uname -m), x86_64)
# ifeq ($(shell if test -d $(OPENCL_DIR)/lib/x86_64/; then echo T; else echo F; fi), T)
# OPENCL_LIB = $(OPENCL_DIR)/lib/x86_64/
# endif
#endif
2、然后修改common/common.mk文件,把SM_VERSIONS改成sm_60
.........
.SUFFIXES : .cu .cu_dbg_o .c_dbg_o .cpp_dbg_o .cu_rel_o .c_rel_o .cpp_rel_o .cubin
# Add new SM Versions here as devices with new Compute Capability are released
# SM_VERSIONS := sm_10 sm_11 sm_12 sm_13
SM_VERSIONS := sm_60
CUDA_INSTALL_PATH ?= /usr/local/cuda-10.0
.........
3、修改cuda/dwt2d/Makefile、cuda/cfd/Makefile、cuda/particlefilter/Makefile、cuda/lavaMD/makefile、cuda/hybridsort/Makefile文件,把所有涉嫌sm_20、compute_20字样的参数里的20都改成60(这里的数字表示计算能力,可以通过https://developer.nvidia.com/cuda-gpus#compute查看,虽然我的GeForce 1070 TI的能力是6.1,但是sm_60也可以编译通过)
4、修改cuda/mummergpu/src/suffix-tree.cpp文件,加入头文件<unistd.h>
5、把openmp/mummergpu/src目录下的内容修改成https://github.com/rmtheis/mummergpu/tree/master/mummergpu-2.0/src目录下的内容,直接复制过来
6、修改opencl/cfd/euler3d.cpp文件,注释掉276~278行的if(file==NULL)判断分支
........
//float* normals;
{
std::ifstream file(data_file_name);
// if(file==NULL){
// throw(string("can not find/open file!"));
// }
file >> nel;
.........
4、复制一些文件
root@sundata:/data/szc/rodinia_3.1# cp -r /usr/local/cuda-10.0/samples/common/inc/* /root/NVIDIA_GPU_Computing_SDK/OpenCL/common/inc/
root@sundata:/data/szc/rodinia_3.1# cp -r /usr/local/cuda-10.0/samples/common/inc/* /root/NVIDIA_GPU_Computing_SDK/C/common/inc/
编译
编译子模块
我们还得手动编译一些东西
1、cuda/kmeans目录下
root@sundata:/data/szc/rodinia_3.1/cuda/kmeans# gcc -g -fopenmp -O2 -c kmeans.c
2、cuda/leukocyte/meschach_lib目录下
root@sundata:/data/szc/rodinia_3.1/cuda/leukocyte/meschach_lib# cc -c -O -DHAVE_CONFIG_H *.c
3、cuda/leukocyte/CUDA目录下
root@sundata:/data/szc/rodinia_3.1/cuda/leukocyte/CUDA# gcc -g -O3 -Wall -I../meschach_lib *.c -c
4、openmp/leukocyte/OpenMP目录下
root@sundata:/data/szc/rodinia_3.1/openmp/leukocyte/OpenMP# cc -c -O -DHAVE_CONFIG_H *.c -I../meschach_lib
5、opencl/leukocyte/OpenCL目录下
root@sundata:/data/szc/rodinia_3.1/opencl/leukocyte/OpenCL# cc -c -O -DHAVE_CONFIG_H *.c -I ../../../openmp/leukocyte/meschach_lib -I /usr/local/cuda-10.0/include
编译项目
6、最后,回到项目根目录,make
root@sundata:/data/szc/rodinia_3.1# make
......
make[1]: Leaving directory '/data/szc/rodinia_3.1/opencl/dwt2d'
root@sundata:/data/szc/rodinia_3.1#
只要最后不报错,就可以了,如果还有报错,就要根据情况修改makefile、源文件或者手动编译
错误处理
1)、如果是类似如下报错
nvcc fatal : Value 'compute_20' is not defined for option 'gpu-architecture'
就要修改对应目录的makefile文件,把里面的XX_20改成XX_60(适合自己GPU计算能力的值)
2)、如果是源文件中代码错误,就得修改对应源文件,比如加入头文件、注释代码、修改类型等
3)、如果是XXX.o文件找不到,那么就得我们自己进入对应目录编译了。编译命令可以参考报错信息上面最近的一行编译命令,只是如果是编译的.h文件,就要改成.c文件;如果我们编译时找不到头文件,那么就locate一下此头文件,再将其目录作为-I参数包含编译命令即可,类似这样
root@sundata:/data/szc/rodinia_3.1/openmp/leukocyte/OpenMP# cc -c -O -DHAVE_CONFIG_H *.c -I/data/szc/rodinia_3.1/openmp/leukocyte/meschach_lib
查看结果
最后,我们看一下bin目录下生成的结果
至此编译完成
运行
以kmeans为例,别的样例可能有问题
1、进入data/kmeans目录
root@sundata:/data/szc/rodinia_3.1# cd data/kmeans/
2、复制过来一份kmeans.cl文件
root@sundata:/data/szc/rodinia_3.1/data/kmeans# cp /data/szc/rodinia_3.1/opencl/kmeans/kmeans.cl .
3、运行测试样例
root@sundata:/data/szc/rodinia_3.1/data/kmeans# ../../bin/linux/opencl/kmeans -i 204800.txt
WG size of kernel_swap = 256, WG size of kernel_kmeans = 256
I/O completed
Number of objects: 204800
Number of features: 34
iterated 19 times
Number of Iteration: 1
root@sundata:/data/szc/rodinia_3.1/data/kmeans# ../../bin/linux/cuda/kmeans -i 204800.txt
I/O completed
Number of objects: 204800
Number of features: 34
iterated 2 times
Number of Iteration: 1
root@sundata:/data/szc/rodinia_3.1/data/kmeans# ../../bin/linux/omp/kmeans -i 204800.txt
I/O completed
num of threads = 1
number of Clusters 5
number of Attributes 34
Time for process: 0.491860
截图如下
错误处理
如果一些测试样例在bin下运行出错
或者压根儿找不到可执行文件(下图就没有b+tree)
一个可行的解决方法就是切换到要运行的模型下(比如opencl),进入自己要测试的应用,进行编译或运行。下面的opencl/bfs直接运行就行了
但是opencl/b+tree却直接报错,内存溢出了应该是
不过cuda版本的就可以正常运行,只是编译前要把Makefile中的sm_20改成sm_60
root@sundata:/data/szc/rodinia_3.1/cuda/b+tree# vim Makefile
root@sundata:/data/szc/rodinia_3.1/cuda/b+tree# make KERNEL_DIM="-DRD_WG_SIZE_0=256"
运行截图如下
结语
总之,编译运行rodinia是一个非常繁琐的过程,期间会遇到很多问题,需要我们根据实际情况想办法去解决。
行文至此,给大家分享一下我的编译结果,很多可执行文件能直接运行:
链接:https://pan.baidu.com/s/1a8x9M_tRN9wqeDU627xkAw
提取码:cgs4
如果有问题,可以在评论区讨论,我看到就会尽快回复的。