GPU比CPU具有更多的内核,因此,在数据并行计算方面,即使GPU的时钟速度较低且与CPU相比缺少几个内核管理功能,GPU的性能也比CPU更好。
因此,事实证明,在GPU上运行Python脚本要比CPU快,但是必须注意的是,要使用GPU处理数据集,数据将首先传输到GPU的内存中,这可能需要额外的时间,因此如果数据设置太小,则cpu的性能可能会好于gpu。
入门:
目前仅支持NVIDIA GPU,此页面列出了这些GPU。如果您的图形卡具有CUDA内核,则可以进一步进行设置。
安装:
首先确保Nvidia驱动程序是最新的,您也可以从此处明确安装cudatoolkit。然后安装Anaconda在安装时将anaconda添加到环境中。
完成所有安装后,在命令提示符下运行以下命令。
conda install numba & conda install cudatoolkit
注意:如果没有将Anaconda添加到环境中,请导航至anaconda安装并找到Scripts目录并在此处打开命令提示符。
代码 :
我们将使用numba.jit装饰器来实现要在GPU上计算的函数。装饰器有几个参数,但是我们将仅使用目标参数。 Target告诉jit为哪个源(“ CPU”或“ Cuda”)编译代码。 “ Cuda”对应于GPU。但是,如果将CPU作为参数传递,则jit会尝试优化代码,以在CPU上更快地运行并提高速度。
from numba import jit, cuda
import numpy as np
# to measure exec time
from timeit import default_timer as timer
# normal function to run on cpu
def func(a):
for i in range(10000000):
a[i]+= 1
# function optimized to run on gpu
@jit(target ="cuda")
def func2(a):
for i in range(10000000):
a[i]+= 1
if __name__=="__main__":
n = 10000000
a = np.ones(n, dtype = np.float64)
b = np.ones(n, dtype = np.float32)
start = timer()
func(a)
print("without GPU:", timer()-start)
start = timer()
func2(a)
print("with GPU:", timer()-start)
输出:基于CPU = i3 6006u,GPU = 920M。
without GPU: 8.985259440999926
with GPU: 1.4247172560001218
但是,必须注意,首先将数组从ram复制到GPU进行处理,如果函数返回任何内容,则返回的值将从GPU复制到CPU。因此,对于较小的数据集,CPU的速度相对较快,但是即使对于较小的数据集,也可以通过将目标作为“ CPU”传递来进一步提高速度。当作为JIT尝试下写的函数调用任何其它函数,那么该函数应该也与JIT进行优化,否则JIT可能会产生更慢码特别应注意。