目录1
准备
- 需要有支持CUDA的Nvidia显卡
linux查看显卡信息:lspci | grep -i vga
使用nvidia显卡可以这样查看:lspci | grep -i nvidia
上一个命令可以得到类似"03.00.0"的显卡代号,查看详细信息:lspic -v -s 03.00.0
查看显卡使用情况(nvidia专用):nvidia-smi
持续周期性输出使用情况(1秒1次):watch -n 1 nvidia-smi- 需要安装pycuda(linux安装:apt install python3-pycuda)
基本使用
1.底层操作
- 准备工作: sudo apt install python3-pycuda
- 在cpu使用的内存中创建矩阵
- 将矩阵从cpu使用的内存移动到gpu的显存中
- 编辑c语言代码,让gpu计算
- 将矩阵从gpu显存移动到cpu使用的内存中
内核与线程层级:
CUDA程序的一个最重要元素就是内核(kernel),它代表可以并行执行的代码
每个内核的执行均有叫做线程(thread)的计算单元完成,与cpu的线程不同,gpu线程更加轻量,上下文切换不会影响性能
为了确定运行一个内核所需的线程数机器逻辑组织形式,CUDA定义了一个二层结构。在最高一层,定义了所谓的区块网格(grid of blocks),这个网格代表了线程区块所在的二维结构,而这些线程区块则是三维的(简单来说,一个cuda结构包含多个blocks,每个blocks包含多个thread)(在下面还会对每个线程区块细分操作)
一个线程区块会被指派给一个流式多处理器(SM),然后这些线程被进一步划分为被称为warp的线程组,其大小有GPU的架构决定
为了充分发挥SM本身的并发性,同一组内的线程必须执行相同的指令,否则会出现线程分歧(divergence of thread)
示例:
用gpu将矩阵每个元素x2
import pycuda