GPU编程(一): Ubuntu下的CUDA8.0环境搭建

简介: 目录 前言 老黄和他的核弹们 开发环境一览 显卡驱动安装 下载驱动 禁用nouveau 安装驱动 安装CUDA8.0 参考 最后 前言 在Linux下安装驱动真的不是一件简单的事情, 我在经历了无数折磨之后终于搭起了GPU编程环境.

目录

  • 前言
  • 开发环境一览
  • 显卡驱动安装
  • 下载驱动
  • 禁用nouveau
  • 安装驱动
  • 安装CUDA8.0
  • 第一个CUDA程序
  • 向世界问好
  • 最后

前言

在Linux下安装驱动真的不是一件简单的事情, 尤其是显卡驱动, 一失败直接进不去系统都是很可能的. 我在经历了无数折磨之后终于搭起了CUDA编程环境. 我是很心水老黄的, 但是, 我还是想说"So, Nvidia: FUCK YOU!"(Linux之父原话)(手动滑稽).

Linux之父

2007年6月23日 NVIDIA公司发布了CUDA, 透过这个技术, 用户可利用NVIDIA的GeForce 8以后的GPU和较新的Quadro GPU进行计算. 亦是首次可以利用GPU作为C-编译器的开发环境. 近年来, GPU最成功的一个应用就是深度学习领域, 基于GPU的并行计算已经成为训练深度学习模型的标配.

GPU并不是一个独立运行的计算平台, 而需要与CPU协同工作, 可以看成是CPU的协处理器, 因此当我们在说GPU并行计算时, 其实是指的基于CPU + GPU的异构计算架构. 在异构计算架构中, GPU与CPU通过PCIe总线连接在一起来协同工作, CPU所在位置称为为主机端(host), 而GPU所在位置称为设备端(device), 如下图所示:

HOST-DEVICE

CUDA技术有下列几个优点:

  • 分散读取--代码可以从存储器的任意地址读取
  • 统一虚拟内存(CUDA 4)
  • 共享存储器--CUDA公开一个快速的共享存储区域(每个处理器48K), 使之在多个进程之间共享.其作为一个用户管理的高速缓存,比使用纹理查找可以得到更大的有效带宽.
  • 与GPU之间更快的下载与回读
  • 全面支持整型与位操作, 包括整型纹理查找

开发环境一览

  • GPU: NVIDIA GT 750M
  • OS: UBUNTU 14.04.1LTS 64位(之后会说为什么选这个版本, 16.04流程基本类似, 但是要注意内核版本)

用指令看下英伟达显卡:

lspci | grep -i nvidia

NVIDIA GT 750M

当你搭建完成环境之后, 可以用代码查看硬件信息, 自己写或者官方的例子, 我的NVIDIA GT 750M信息显示如下图, 当然可以直接到英伟达官网查看显卡信息.

显卡信息

官方例子显卡信息


显卡驱动安装

千万不要用UBUNTU附加驱动里提供的显卡驱动!!!
千万不要用UBUNTU附加驱动里提供的显卡驱动!!!
千万不要用UBUNTU附加驱动里提供的显卡驱动!!!
一般来说, 你会遇到一些奇怪的问题, 当然, 锦鲤是不会出问题的(手动滑稽).
这是第一个坑点, 大体有三种展现方式:

  • 装完重启进不去系统, 卡住ubuntu加载页面;
  • 无限登录;
  • 装好了, 进入了系统, 然后输入nvidia-smi指令没有任何反应. 正常情况会弹出一张表, 如下所示:

nvidia-smi


下载驱动

行了, 来说说我的实操:
首先到官网下载显卡驱动, 比方说我是GT 750M, 操作系统是64位Linux, 我就找对应的版本进行下载.

下载驱动

删掉以往的驱动. 注意, 就算你啥都没装, 这步也是无害的.

sudo apt-get remove --purge nvidia*

更新并安装一些需要的库, 先装这么多, 之后装CUDA还有一波.

sudo apt-get update
sudo apt-get install dkms build-essential linux-headers-generic

禁用nouveau

打开blacklist.conf, 在最后加入禁用nouveau的设置, 这是一个开源驱动, 如图所示:

sudo vim /etc/modprobe.d/blacklist.conf
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

禁用nouveau

禁用nouveau内核模块

echo options nouveau modeset=0
sudo update-initramfs -u

重启. 如果运行如下指令没用打印出任何内容, 恭喜你, 禁用nouveau成功了.

lsmod | grep nouveau

安装驱动

来到tty1(快捷键ctrl + alt + f1,如果没反应就f1-f7一个个试, 不同Linux, 按键会略有不同). 运行如下指令关闭图形界面.

sudo service lightdm stop

安装驱动, 注意有坑, 一定要加-no-opengl-files, 不加这个就算安装成功, 也会出现无限登录问题.

sudo chmod u+x NVIDIA-Linux-x86_64-390.87.run 
sudo ./NVIDIA-Linux-x86_64-390.87.run –no-opengl-files

如果你已经装了, 但是没有加-no-opengl-files, 按照如下操作可以救一下.

sudo ./NVIDIA-Linux-x86_64-390.87.run –uninstall
sudo ./NVIDIA-Linux-x86_64-390.87.run –no-opengl-files

重启. 用nvidia-smi指令试一下, 如果看到类似下图, 恭喜你, 驱动安装成功. 或者看到附加驱动显示继续使用手动安装的驱动.

nvidia-smi

附加驱动


安装CUDA8.0

先来补库.

sudo apt-get install freeglut3-dev libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

官网下载要的CUDA版本, 我这里是8.0第二个版本, 下载runfile(local)版本, 如下图所示:

安装CUDA8.0

md5检测一下, 不合格要重新下载. 下图是我的检测结果:

md5sum cuda_8.0.61_375.26_linux.run

md5检测

再次关闭图形界面

sudo service lightdm stop

安装时候依旧要加-no-opengl-files参数, 之后一路默认就好.

sudo sh cuda_8.0.61_375.26_linux.run –no-opengl-files

然后会看到三个installed.

开启图形界面

sudo service lightdm start

这里又有一个坑, 如果是14.04.5, 我到这一步就开启不了了, 后来换成14.04.1就可以了, 总之内核也要小心选择.

运行如下命令, 如果显示如图3个文件夹, 恭喜你.

ls /dev/nvidia*

如果少了或者都找不到, 还有一些操作要做. 用vim创建一个xxx.sh(名字随意), 输入以下内容:

#!/bin/bash

/sbin/modprobe nvidia

if [ "$?" -eq 0 ]; then
  # Count the number of NVIDIA controllers found.
  NVDEVS=`lspci | grep -i NVIDIA`
  N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
  NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`

  N=`expr $N3D + $NVGA - 1`
  for i in `seq 0 $N`; do
    mknod -m 666 /dev/nvidia$i c 195 $i
  done

  mknod -m 666 /dev/nvidiactl c 195 255

else
  exit 1
fi

/sbin/modprobe nvidia-uvm

if [ "$?" -eq 0 ]; then
  # Find out the major device number used by the nvidia-uvm driver
  D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`

  mknod -m 666 /dev/nvidia-uvm c $D 0
else
  exit 1
fi

运行后就会看到3个文件夹.

sudo chmod +x xxx.sh
sudo ./xxx.sh
ls /dev/nvidia*
/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-uvm

然后写入rc.local中, 如图所示:

sudo vim /etc/rc.local

rc.local

打开环境配置文件

sudo vim /etc/profile

最后写入:

export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

保存退出, 并其生效.

source /etc/profile

然后就能看到了.

运行一些检测命令, 如果和我显示的类似, 恭喜你, 环境配置完成.

cat /proc/driver/nvidia/version
nvcc -V

检测

当然, 你可以编译NVIDIA Samples中的例子, 然后运行. 最常见的就是deviceQuery了. 走两步:

deviceQuery


第一个CUDA程序

之前在开发环境部分展示过一个小栗子, 来看看具体代码吧~

vim Device.cu
#include <stdio.h>
int main() {
        int nDevices;

        cudaGetDeviceCount(&nDevices);
        for (int i = 0; i < nDevices; i++) {
                cudaDeviceProp prop;
                cudaGetDeviceProperties(&prop, i);
                printf("Device Num: %d\n", i);
                printf("Device name: %s\n", prop.name);
                printf("Device SM Num: %d\n", prop.multiProcessorCount);
                printf("Share Mem Per Block: %.2fKB\n", prop.sharedMemPerBlock / 1024.0);
                printf("Max Thread Per Block: %d\n", prop.maxThreadsPerBlock);
                printf("Memory Clock Rate (KHz): %d\n",
                   prop.memoryClockRate);
                printf("Memory Bus Width (bits): %d\n",
                   prop.memoryBusWidth);
                printf("Peak Memory Bandwidth (GB/s): %.2f\n\n",
                   2.0 * prop.memoryClockRate * (prop.memoryBusWidth / 8) / 1.0e6);
        }
        return 0;
}
nvcc Device.cu -o Device.o
./Device.o

第一个CUDA程序


向世界问好

没有Hello, world!怎么行? 具体说明要到下期了哦~

#include <stdio.h>

__global__ void helloFromGPU ()
{
        printf("Hello, world! from GPU!\n");
}

int main()
{
        printf("Hello, world! from CPU!\n");

        helloFromGPU <<<2, 10>>>();

        cudaDeviceReset();

        return 0;
}

Hello, world!


最后

事实上, 由于没有以GPU为单独核心的终端, 所以GPU编程其实都是CPU + GPU结构的, CPU负责复杂的串行, GPU负责并行计算. 好了, 喜欢记得点赞哦, 有意见或者建议评论区见~

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
4月前
|
Ubuntu 测试技术 Linux
dpdk测试环境搭建(vmware下ubuntu环境参考上文汇总流程)
dpdk测试环境搭建(vmware下ubuntu环境参考上文汇总流程)
95 0
|
5月前
|
并行计算 Ubuntu PyTorch
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10(下)
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10(上)
137 0
|
5月前
|
并行计算 Ubuntu PyTorch
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10(上)
Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10
143 0
|
5月前
|
并行计算 Ubuntu PyTorch
Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)(上)
Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)
123 0
|
1月前
|
Ubuntu 网络协议 Java
在Android平板上使用code-server公网远程Ubuntu服务器编程
在Android平板上使用code-server公网远程Ubuntu服务器编程
|
2月前
|
机器学习/深度学习 并行计算 流计算
【GPU】GPU CUDA 编程的基本原理是什么?
【GPU】GPU CUDA 编程的基本原理是什么?
46 0
|
2月前
|
并行计算 Ubuntu 异构计算
百度搜索:蓝易云【Ubuntu环境下的cuda安装】
安装完成后,CUDA就成功安装在Ubuntu系统中了,你可以开始使用CUDA来进行GPU加速的计算。请注意,安装CUDA可能会影响系统的稳定性,建议在安装前备份重要数据,并确保对操作有足够的了解。如果不确定如何操作,建议寻求专业的帮助或咨询。
39 7
|
4月前
|
并行计算 TensorFlow 算法框架/工具
Linux Ubuntu配置CPU与GPU版本tensorflow库的方法
Linux Ubuntu配置CPU与GPU版本tensorflow库的方法
|
4月前
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。