CuPy

CuPy是一个基于CUDA的库,提供与NumPy兼容的多维数组,用于GPU上的大规模计算。通过将计算任务从CPU转移到GPU,CuPy能够显著提高数组和矩阵运算的速度。在测试中,纯GPU计算比纯CPU快了多个数量级,但混合CPU和GPU编程可能会引入额外的开销。使用CuPy时,建议使用其内置函数以避免不必要的数据转移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的用处概述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值