python并行编程 - GPU篇

目录1

介绍篇
线程篇
进程篇
异步篇
GPU篇
分布式篇


准备

  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
  2. 需要安装pycuda(linux安装:apt install python3-pycuda)

基本使用

1.底层操作

  1. 准备工作: sudo apt install python3-pycuda
  2. 在cpu使用的内存中创建矩阵
  3. 将矩阵从cpu使用的内存移动到gpu的显存中
  4. 编辑c语言代码,让gpu计算
  5. 将矩阵从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.driver as cuda
import pycuda.autoinit  # init GPU
from pycuda.compiler import SourceModule

import numpy as np

# 1.cpu create matrix
a = np.random.randn(5, 5)	# matrix:m*n
a = a.astype(np.float32)	# nvidia only support float calculate

# 2.move to gpu from cpu
a_gpu = cuda.mem_alloc(a.nbytes)	# alloc memory of gpu, this is 1 dim
cuda.memcpy_htod(a_gpu, a)		# copy cpu memory to gpu memory

# 3.gpu calculate
# create module of gpu calculate by c
mod = SourceModule('''
	__global__ void doubleMatrix(float *a)
	{
		int idx = threadIdx.x + threadIdx.y * 5;	// (x,y,z), gpu -> sm -> warp
		a[idx] *= 2;
	}
''')

func = mod.get_function('doubleMatrix')	# get function from module
func(a_gpu, block = (5, 5, 1))		# set var and thread number from (x,y,z) orient to function

# 4.move to cpu from gpu
a_doubled = np.empty_like(a)		# create memory of cpu
cuda.memcpy_dtoh(a_doubled, a_gpu)	# copy gpu memory to cpu memory

print('original matrix')
print(a)
print('double matrix')
print(a_doubled)

注1import pycuda.autoinit 语句自动根据GPU可用性和数量选择要使用的GPU,这将创建一个接下来的代码运行中所需的GPU上下文(只需导入即可完成)

: astype(numpy.float32):将矩阵中的项转换为单精度模式,因为许多Nvidia显卡只支持单精度

注3:在调用gpu的c函数时,通过block参数设定,分配线程的方式,(5, 5, 1)是对应这gpu的(x, y, x)的分配
在c函数中,threadIdx是一个结构体,它有三个字段xyz,每个线程中的这个变量都不同(结合线程层级理解),故用此索引数组,由于动态分配的gpu内存是一维数组,所以需要在c函数内,使用threadIdx.y乘以矩阵每行的元素个数转换
更多详情:自行搜索cuda的线程区块划分

注4:gpu执行的c函数中 __global__ 关键字表示该函数是一个内核函数,必须从主机上调用才能在gpu设备上生成线程层级
涉及到pycuda内存,为了最大限度地利用可用资源,在支持CUDA的GPU显卡中,有4类内存:
寄存器(registers):每个线程将被分配一个寄存器,每个线程只能访问自身的寄存器,即使同属于一个线程区块
共享存储器(shared memory):在共享存储器中,每个线程区块都有一个其内部线程共享的内存,这部分内存速度极快
常数存储器(constant memory):一个网格中的所有线程一直都可以访问这部分内存,但只能在读取时访问。常数存储器中的数据在应用持续期间一直存在
全局存储器(global memory),:所有网格中的线程(也包含所有内核)都可访问全局存储器

更多详情:自行搜索PyCUDA内存模型

2.python封装控制

用gpuarray调用内核,它可以直接将数据保存在计算设备(gpu)中,并在该设备中进行计算

示例:
用gpu将矩阵每个元素x2

import pycuda.autoinit
import pycuda.gpuarray as gpuarray

import numpy as np

x = np.random.randn(5, 5)
x_gpu = gpuarray.to_gpu(x)

x_doubled = (2 * x_gpu).get()

print('x:')
print(x)
print('x_doubled:')
print(x_doubled)

其它

还有其它的库可以方便对cuda编程,如NumbaPro是一个Python编译器,提供了基于CUDA的API编程接口,可以编写CUDA持续,它专门设计用来执行与数组相关的计算任务,和广泛使用的numpy库类似
NumbaPro: 对GPU编程的库,提供许多的数值计算库,GPU加速库



  1. 参考书籍:《Python并行编程手册》 ↩︎

  • 0
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是安装tensorflow-gpu的步骤: 1. 首先,确保您已经安装了NVIDIA显卡驱动程序。您可以在NVIDIA官方网站上下载并安装最新的显卡驱动程序。 2. 接下来,您需要安装CUDA工具包。在安装CUDA工具包之前,请确保您的显卡支持CUDA计算。您可以在NVIDIA官方网站上找到CUDA工具包的下载链接,并根据您的显卡型号下载对应的版本。 3. 安装cuDNN库。cuDNN是NVIDIA提供的针对深度神经网络的加速库,可以提高深度学习训练的速度和效率。您可以在NVIDIA官方网站上下载cuDNN库,并按照安装指南进行安装。 4. 然后,您可以使用pip安装tensorflow-gpu。在命令行中运行以下命令:pip install tensorflow-gpu 5. 安装完成后,您可以在Python中导入tensorflow-gpu库并开始使用它。 希望这些步骤能够帮助您成功安装tensorflow-gpu! ### 回答2: 安装tensorflow-gpu需要按照以下步骤进行: 1. 安装NVIDIA显卡驱动程序:在安装tensorflow-gpu之前,首先需要确保计算机上的NVIDIA显卡驱动程序已正确安装并更新到最新版本,以充分利用显卡的计算能力。 2. 安装CUDA Toolkit:CUDA Toolkit是一个针对NVIDIA GPU并行计算平台和编程模型。去NVIDIA官网下载适用于自己显卡版本的CUDA Toolkit,并按照官方文档进行安装。 3. 安装cuDNN:cuDNN是一个高性能的GPU加速库,用于深度神经网络的加速。在官方网站上下载与CUDA版本对应的cuDNN,解压文件并将其复制到CUDA Toolkit的安装目录中。 4. 安装tensorflow-gpu:打开命令提示符窗口,并输入以下命令来安装tensorflow-gpu: ``` pip install tensorflow-gpu ``` 这将使用pip工具从Python包索引中下载并安装tensorflow-gpu。确保已经激活了Python虚拟环境(如果有的话)。 5. 验证安装:安装完成后,通过运行以下Python代码来验证是否成功安装了tensorflow-gpu: ```python import tensorflow as tf print(tf.__version__) print(tf.test.is_gpu_available()) ``` 如果版本号正确且输出为True,则表示安装成功,并且可以开始使用tensorflow-gpu进行深度学习任务了。 需要注意的是,安装tensorflow-gpu需要计算机满足一定的硬件要求,包括NVIDIA显卡的兼容性以及是否支持CUDA和cuDNN等。在安装之前,建议查看tensorflow官方文档,了解所需的硬件和软件要求。 ### 回答3: 安装tensorflow-gpu可以提高机器学习和深度学习任务的训练速度,以下是安装步骤: 1. 首先,确保你的计算机已经安装了适当的NVIDIA显卡驱动程序。可以在NVIDIA官方网站上下载并安装与你的显卡型号匹配的驱动程序。 2. 接下来,安装CUDA(Compute Unified Device Architecture),这是NVIDIA的并行计算平台和应用程序接口。根据你的显卡型号,选择并下载适当版本的CUDA,并进行安装。记住在安装过程中设置正确的安装路径,以便后续配置时使用。 3. 安装cuDNN(CUDA Deep Neural Network library),它是专门为深度神经网络设计的GPU加速库。从NVIDIA开发者网站上下载与你安装的CUDA版本匹配的cuDNN版本,并按照官方文档进行安装。 4. 在终端窗口中打开一个命令行界面,使用适当的包管理工具(如pip或conda)安装tensorflow-gpu。运行命令 "pip install tensorflow-gpu"(如果使用pip)或 "conda install tensorflow-gpu"(如果使用conda)。这将自动下载并安装最新的tensorflow-gpu版本以及其依赖项。 5. 安装完成后,可以验证tensorflow-gpu是否正确安装。在命令行中输入python来启动Python解释器,然后输入以下代码来导入tensorflow-gpu并打印其版本号: ``` import tensorflow as tf print(tf.__version__) ``` 如果能够成功导入并打印出版本号,则表示tensorflow-gpu已经正确安装。 完成上述步骤后,你就成功地安装了tensorflow-gpu。现在你可以开始使用它进行GPU加速的机器学习和深度学习任务了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值