编译运行rodinia_3.1

目录

背景

步骤

下载与解压

修改与复制文件

编译

编译子模块

编译项目

错误处理

查看结果

运行

错误处理

结语

背景

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 

如果有问题,可以在评论区讨论,我看到就会尽快回复的。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值