目录
kokkos简介
kokkos是美国Sandia 国家实验室开发的一个号称可以实现performance portability的C++库,它提供一种编程模型,通过在程序中使用kokkos的API,可以让同一程序在不同的计算设备如CPU、GPU、KNL上均达到较高的性能。其主要思想是根据实际使用的计算设备的不同,不仅实现了相应最佳的计算并行方式,而且实现了相应最佳的内存访问方式。kokkos目前提供了包括并行编程模型库kokkos-core、数学核函数库kokkos-kernels、性能分析与排错工具kokkos-tools等在内的一套性能可移植C++编程系统。kokkos为开源项目,项目地址:https://github.com/kokkos关于kokkos编程模型的使用已有教程和文档可以参考:https://github.com/kokkos/kokkos-tutorials,http://wiki.sugon.com/pages/viewpage.action?pageId=15008166,本文主要介绍kokkos的安装和测试情况。
下载安装
本文只安装kokkos核心库。从github下载:https://github.com/kokkos/kokkos.git
cuda后端安装
使用cmake进行构建。在kokkos顶层目录新建build目录,进入build目录,使用如下命令进行配置:
cmake .. \
-DCMAKE_INSTALL_PREFIX=/public/home/test/sourcecode/Kokkos/kokkos-core-install \
-DCMAKE_CXX_COMPILER=/public/home/test/sourcecode/Kokkos/kokkos/bin/nvcc_wrapper \
-DKokkos_ENABLE_CUDA=ON -DKokkos_ARCH_PASCAL60=ON -DKokkos_ENABLE_OPENMP=ON \
-DKokkos_ENABLE_TESTS=ON -DKokkos_CUDA_DIR=/usr/local/cuda
需要注意的是,安装cuda后端版本需要使用kokkos提供的nvcc_wrapper作为C++编译器,这是一个bash脚本,位于kokkos核心库的bin目录。另外还需要根据实际使用的GPU卡指定CUDA ARCH,对于P100,指定ARCH为PASCAL60,否则默认为KEPLER35,编译后无法运行。
配置完成后,执行make。make完成后,执行make test运行自带单元测试。单元测试可以全部通过:
100% tests passed, 0 tests failed out of 35
Total Test time (real) = 734.08 sec
最后执行make install,完成安装。cmake配置过程中指定的安装目录下生成如下目录:
bin include lib64
HIP后端安装
使用cmake进行构建。在kokkos顶层目录新建build目录,进入build目录,使用如下命令进行配置:
cmake .. \
-DCMAKE_INSTALL_PREFIX=/public/home/gromacs/sourcecode/Kokkos/kokkos-core-install \
-DCMAKE_CXX_COMPILER=hipcc -DKokkos_ENABLE_HIP=ON \
-DKokkos_ENABLE_OPENMP=OFF -DKokkos_ENABLE_PTHREAD=OFF \
-DKokkos_ENABLE_TESTS=ON
需要注意的是,安装HIP后端版本需要使用hipcc作为C++编译器,不能再使用kokkos提供的nvcc_wrapper,也没有hipcc_wrapper。另外由于rocm使用的llvm编译器不带openmp库,需要把kokkos 的openmp后端选项关闭。pthread后端在测试时也有问题,暂时也关闭。所以这样配置的kokkos安装后只有主机端串行以及offload到设备端两种执行方式。
配置完成后,执行make。make完成后,执行make test运行自带单元测试。单元测试可以全部通过:
100% tests passed, 0 tests failed out of 31
Total Test time (real) = 332.29 sec
最后执行make install,完成安装。cmake配置过程中指定的安装目录下生成的目录与cuda后端版本一样。
算例测试
上一节安装后的单元测试都得到了通过,本节使用单独的算例进行测试。kokkos目前对HIP的支持处于实验阶段,尽管kokkos核心库自带的example和benchmark目录下有一些算例,但是这些算例都没有HIP的支持。kokkos-tutorials项目中的两个算例带有HIP支持,分别是Intro-Full/Exercises目录下的04算例和mpi_pack_unpack算例。其中mpi_pack_unpack算例经测试发现在CUDA平台和HIP平台均不能正常运行,所以本节只介绍04算例。
kokkos-tutorials/Intro-Full/Exercises/04目录下有Begin和Solution两个目录,分别是该练习的原始代码以及答案代码。该练习旨在通过修改数据存储的方式和位置(layouts and spaces)对比程序运行的效率。Begin目录下的原始代码,没有显式指定数据的存放位置和方式,Solution目录下的代码,数据是以Kokkos::LayoutLeft的方式存放在设备端,二者都可以使用kokkos支持的设备进行加速。
cuda后端测试
进入Begin目录,修改Makefile文件中的KOKKOS_PATH使其为本机安装的kokkos核心库路径:
KOKKOS_PATH = ${HOME}/sourcecode/Kokkos/kokkos
修改KOKKOS_DEVICES值为OpenMP,然后执行make,当前目录下生成可执行文件04_Exercise.host和较多的目标文件和库文件。执行./04_Exercise.host -h查看帮助信息:
y^T*A*x Options:
-Rows (-N) <int>: exponent num, determines number of rows 2^num (default: 2^12 = 4096)
-Columns (-M) <int>: exponent num, determines number of columns 2^num (default: 2^10 = 1024)
-Size (-S) <int>: exponent num, determines total matrix size 2^num (default: 2^22 = 4096*1024 )
-nrepeat <int>: number of repetitions (default: 100)
-help (-h): print this message
本算例是计算两个维度分别为2的M次方和2的N次方的向量的点乘。分别使用如下运行方式进行测试:
./04_Exercise.host -M 10 -N 20
./04_Exercise.host -M 20 -N 10
均使用48个CPU线程进行计算,结果如下:
User M is 1024
Use