本文主要是介绍CuPy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CuPy是基于CUDA实现与NumPy兼容的多维数组的实现。CuPy由核心多维数组类cupy.ndarray和许多函数组成。它支持numpy。ndarray接口的字集。CuPy专门进行大型、高维数组、矩阵的快速计算。
- 安装
#Binary Package for CUDA 10.0
pip3 install cupy-cuda100 --user
-
NumPy和CuPy
NumPy自动调用cpu来进行数组合矩阵间的计算,计算惹我默认单进程;CuPy自动调用gpu来进行数组合矩阵间的计算,gpu中默认并行计算。二者的函数和实际操作的功能基本完全一样,只需要把np.xxx()
该成cp.xxx()
即可。 -
CuPy优势
- 数组、矩阵的维度、尺寸一定要够大,计算量够大才行,最好矢量化编程,否则GPU的初始化耗时都比计算时间都长。
- 数组、矩阵间的运算,比如矩阵相加、相乘、点乘等,一定要直接使用CuPy自动的函数,能用自带函数就尽量用自带函数。例如
cupy.add (x1, x2)
不用直接写x1+x2
。 - 避免CPU和GPU混合编程,相比计算任务来说,CPU和GPU之间的切换、数据互动等一系列初始化非常耗时。
-
测试
import cupy as cp
import numpy as np
import time# 高维矩阵/数组:
gpu = cp.ones( (1024,512,4,4) )
cpu = np.ones( (1024,512,4,4) )# 纯numpy的cpu测试:
ctime1 = time.time()
for c in range(1024):cpu = np.add(cpu,cpu) # 这里用np.add()和直接用 + 一样!内核都是cpu来算
ctime2 = time.time()
ctotal = ctime2 - ctime1
print('纯cpu计算时间:', ctotal)# 纯cupy的gpu测试:
gtime1 = time.time()
for g in range(1024):gpu = cp.add(gpu,gpu) # 自带的加法函数
gtime2 = time.time()
gtotal = gtime2 - gtime1
print('纯gpu计算时间:', gtotal)# gpu和cpu混合编程:
ggtime1 = time.time()
for g in range(1024):gpu = gpu + gpu # 手工加法:+ 默认回到cpu计算!!!
ggtime2 = time.time()
ggtotal = ggtime2 - ggtime1
print('混合的计算时间:', ggtotal)
- 耗时结果
纯cpu计算时间: 43.857738733291626
纯gpu计算时间: 0.02496480941772461
混合的计算时间: 1.4730699062347412
- 错误
@cupy.util.memoize(for_each_device=True)
AttributeError: module 'cupy' has no attribute 'util'
修改为(去掉util):
@cupy.memoize(for_each_device=True)
参考资料
CuPy 基于CUDA实现与NumPy兼容的多维数组的实现
Cupy的用处概述
这篇关于CuPy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!