1. 安装 Nvidia 显卡驱动
安装 Nvidia 显卡驱动,得要禁用 CentOS 默认的 nouveau 驱动,然后安装 Nvidia 驱动
下载显卡驱动
# wget http://cn.download.nvidia.com/XFree86/Linux-x86_64/340.65/NVIDIA-Linux-x86_64-340.65.run
禁用 Nvidia 显卡驱动
# echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
备份并重建系统引导的 image 文件
# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut -v /boot/initramfs-$(uname -r).img $(uname -r)
重启后在 init3 模式下安装显卡驱动
# init 3
# sh NVIDIA-Linux-x86_64-340.65.run
2. 检测显卡性能参数
推荐使用 CUDA-Z 来检测显卡性能参数。正常使用 CUDA-Z 需要依赖一些库文件和 GCC 。
$ wget http://downloads.sourceforge.net/project/cuda-z/cuda-z/0.9/CUDA-Z-0.9.231.run
$ mv CUDA-Z-0.9.231.run ~/bin/CUDA-Z
运行 CUDA-Z 前安装如下一些系统软件
$ sudo yum install libXrender*
$ sudo yum install libXrender*i686*
$ sudo yum install libXext*
$ sudo yum install libXext*i686*
$ sudo yum install libz*
$ sudo yum install libz*i686*
将 GCC 的库文件路径设置正确
$ export C_INCLUDE_PATH=/opt/gcc-4.7.2/include
$ export LD_LIBRARY_PATH=/opt/gcc-4.7.2/lib64:/opt/gcc-4.7.2/lib
运行 CUDA-Z 图形化界面,界面和 windows 下的 CPU-Z 一致。
$ CUDA-Z
显卡一些高级常识,例如:
我的笔记本电脑 GTX570M 显卡: 该 GPU 有 7个 SM,每个 SM 有 48 个 SP,每个 SP 有 32 个 warp; SP 称为流处理器,该值越大,则显卡性能越好; warp 是最小的硬件执行单位,则该显卡最大的线程数是 7*48*32=10752。
SM 之间可以理解是物理隔绝的,不同的 SM 的计算是独立的。将数据用显卡进行计算时,进行并行计算时,我个人理解成这样: 把运行的程序做成很多小份进行并行计算;所有的并行计算的总体称为 Grid,并行运算的最小单元为 thread;gpu-blast在默认设置中,将 64 个 threads 合并为 1 个 block,因此 1 个 block 的运行需要 2 个 SP 进行运算;gpu-blast在默认设置中,运行一个程序,将之分割成 521 个 blocks, 这 512 个 blocks 则需要 1024 个 SP 进行运算,可以达到最快的运算速度。所以,如果 GPU 的 SP 总数超过 1024, 则不能完全发挥显卡的性能。
对于 GTX570M 显卡,我设置 gpu-blast 的参数 -gpu_threads 32 -gpu_blocks 336 我觉得是比较好的。这样,将 blast 程序分割为 336 个 blocks 进行并行计算;将所有的 block 分配给所有的 SP ,刚好每个 SP 都运行 32 线程。但实际上,使用 gpu-blast 默认的参数也更好地发挥显卡性能,我个人实验结果是,-gpu_threads 128 -gpu_blocks 512 的结果更加不错。
3. 安装 CUDA Toolkits
CUDA 的下载网址: https://developer.nvidia.com/cuda-downloads
$ wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run
$ sudo init 3
# sh cuda_6.5.14_linux_64.run
4. 安装 GPU-Blast
GPU-Blast官网: http://archimedes.cheme.cmu.edu/?q=gpublast
GPU-Blast 提供的最高 blast 版本是 2.2.28 版本,需要 ncbi-blast 同版本源码文件支持。
$ mkdir /opt/biosoft/gpu_blast
$ cd /opt/biosoft/gpu_blast
从源码包安装 ncbi-blast 2.2.28 版本(此步骤可选)
$ wget ftp://ftp.ncbi.nih.gov/blast/executables/blast+/2.2.28/ncbi-blast-2.2.28+-src.tar.gz
$ tar zxf ncbi-blast-2.2.28+-src.tar.gz
$ cd ncbi-blast-2.2.28+-src/c++
$ ./configure && make -j 8
安装 GPU-Blast 前需要将 CUDA Toolkits 的库文件与头文件加入到能识别的路径
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
$ echo 'export C_INCLUDE_PATH=/usr/local/cuda/include/:$C_INCLUDE_PATH' >> ~/.bashrc
$ source ~/.bashrc
下载并安装 GPU-Blast
$ wget http://eudoxus.cheme.cmu.edu/gpublast/gpu-blast-1.1_ncbi-blast-2.2.28.tar.gz
$ tar zxf gpu-blast-1.1_ncbi-blast-2.2.28.tar.gz
$ perl -p -i -e 's/LATEST/2.2.28/' install
$ perl -p -i -e 's/make /make -j /' install
$ ./install
Do you want to install GPU-BLAST on an existing installation of "blastp" [yes/no]
如果输入 no 则会自动下载 ncbi-blast-2.2.28+-src.tar.gz,并进行安装,需要做上述修改,否则下载地址不正确。同时,默认下 make 编译是单线程运行,加入 -j 参数来并行运算,从而加快编译速度。
如果选择 yes,则需要输入 blastp 的路径,该路径是 blastp 的编译后所在的路径,而不是安装路径。输入 /opt/biosoft/gpu_blast/ncbi-blast-2.2.28+-src/c++/GCC447-Debug64/bin/ , 按 Enter 进行安装。
安装完毕后,将程序文件所在路径加入环境变量 PATH
$ ln -s ncbi-blast-2.2.28+-src/c++/GCC447-ReleaseMT64/bin/ bin
$ echo 'PATH=$PATH:/opt/biosoft/gpu_blast/bin' >> ~/.bashrc
$ source ~/.bashrc
安装完毕后,程序文件位于
4. 运行 GPU-Blast
以 Swissprot 数据库为例:
首先,以 fasta 文件构建 blast 数据库,需要加入 -sort_volumes 参数
$ makeblastdb -dbtype prot -in uniprot_sprot.fasta -out uniprot_sprot -sort_volumes -max_file_sz 500MB
然后,在普通 blast 数据库基础上构建 gpu 数据库。使用 -method 2 参数生成 gpu 数据库文件
$ blastp -db uniprot_sprot -query test.fa -gpu t -method 2
再使用 -gpu t 运用 gpu_blast,否则是单纯用 CPU 进行计算
$ blastp -db uniprot_sprot -query test.fa -gpu t
使用 gpu_blast 确实能加快速度,在软件的示例中,在 -num_threads 2 下,GPU 有 2.5 倍的加速。
我的使用经验: 对 40 条蛋白序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 8, gpu_blast 耗时 1m41.053s, cpu_blast 耗时 0m52.264s; 对 8 条蛋白质序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 2,gpu_blast 耗时 0m7.892s, cpu_blast 耗时 0m12.717s;对同样 8 条蛋白质序列使用 blastp 比对到 Swissprot 数据库, 设置 -num_threads 8,gpu_blast 耗时 0m5.288s, cpu_blast 耗时 0m5.836s;
个人使用感觉: 虽然有 GPU 加速,但是依然需要耗费大量 CPU,而不是只运用了 GPU 进行计算; 如果 CPU 本身运行速度较快的时候,使用 GPU 加速的比率则较低了。