GPU结构
CPU v.s. GPU
CPU是被设计用来处理复杂任务的,而GPU只能做好一件事-处理百万级的低级任务(原来是被用来生成3D图形中的三角形),而且GPU有上千个ALU(算术逻辑单元),而CPU通常只有8个。而且很多程序大部分时间都花在GPU擅长的简单运算上了,所以GPU加速程序很有必要。
CUDA编程有越来越复杂的趋势,但pyCUDA则大大简化了这个过程,并且拥有GPU加速的享受,所以面向GPU的高级编程正逐渐成为主流。
GPU内部图:
CUDA处理流程图:
可以看出,由CPU向GPU部署处理任务,同时由内存向GPU显存复制处理数据,而后GPU的显存将数据布置到每个核进行搞笑的并行运算,而后将结果返回显存,再由显存将结果返回内存。这个流程将会在程序中反复出现。
pyCUDA的安装在python下很简单,只要:(本人用的python3,例子中都改成python3了,其实变得不大)
ubuntu下,sudo pip3 install pycuda
windows命令行,pip3 install pycuda
同时分享,api和官方例子地址:
api:
https://documen.tician.de/pycuda/index.html、
例子:
https://wiki.tiker.net/PyCuda
HelloGPU例子:
import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
import numpy.linalg as la
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
""")
multiply_them = mod.get_function("multiply_them")
a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)
dest = numpy.zeros_like(a)
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
block=(400,1,1))
print(dest-a*b)