前提:傳統(tǒng)的數(shù)組和矩陣都是通過numpy來設(shè)定喊巍,然后numpy來調(diào)用cpu計(jì)算屠缭!
cupy的作用:數(shù)組和矩陣都是通過cupy來設(shè)定,然后cupy來調(diào)用gpu并行計(jì)算玄糟!
區(qū)別與聯(lián)系:
- 區(qū)別:numpy自動調(diào)用cpu來進(jìn)行"數(shù)組和矩陣間"的計(jì)算勿她,計(jì)算任務(wù)默認(rèn)單進(jìn)程;cupy自動調(diào)用gpu來進(jìn)行"數(shù)組和矩陣間"的計(jì)算阵翎,gpu中默認(rèn)并行計(jì)算逢并!
- 聯(lián)系:二者的函數(shù)和實(shí)操的功能基本完全一樣,一般只需把np.xxx()改成cp.xxx()即可郭卫。當(dāng)然砍聊,cupy還未完全寫完,有些numpy的函數(shù)它還未實(shí)現(xiàn)(基本用不到)贰军。
cupy的優(yōu)勢:專門進(jìn)行大型玻蝌、高維數(shù)組/矩陣的快速計(jì)算(非常非承分猓快)!
要想實(shí)現(xiàn)數(shù)組/矩陣的快速運(yùn)算俯树,要注意3點(diǎn):
- 數(shù)組/矩陣的維度帘腹、尺寸一定要夠大,計(jì)算量夠大才行许饿,否則gpu的初始化都耗的時(shí)間比計(jì)算時(shí)間都長阳欲!總之:計(jì)算量一定要夠大,最好矢量化編程陋率;
- 數(shù)組/矩陣間的運(yùn)算球化,比如矩陣相加、相乘瓦糟、點(diǎn)乘等筒愚,一定要直接使用cupy自帶的函數(shù)(如加法:cupy.add(x1,x2))!不要直接寫一個(gè):+ 運(yùn)算符菩浙!即:能用自帶函數(shù)就盡量用自帶函數(shù)巢掺!
- 一定避免cpu和gpu混合編程:比如在一個(gè)循環(huán)計(jì)算中,每一步循環(huán)中的計(jì)算量不大芍耘,但是又有cpu計(jì)算(比如加減乘除賦值等)址遇,又用gpu矩陣計(jì)算。此時(shí)用cupy反而會降低運(yùn)算效率斋竞!因?yàn)?cpu和gpu之間的切換倔约、數(shù)據(jù)互通等一系列初始化非常耗時(shí)"(相比計(jì)算任務(wù)來說)!
下面用一個(gè)很簡單的例子即可體現(xiàn)上面的內(nèi)容:循環(huán)矩陣相加
import cupy as cp
import numpy as np
import time
# 高維矩陣/數(shù)組:
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()和直接用 + 一樣坝初!內(nèi)核都是cpu來算
ctime2 = time.time()
ctotal = ctime2 - ctime1
print('純cpu計(jì)算時(shí)間:', ctotal)
# 純cupy的gpu測試:
gtime1 = time.time()
for g in range(1024):
gpu = cp.add(gpu,gpu) # 自帶的加法函數(shù)
gtime2 = time.time()
gtotal = gtime2 - gtime1
print('純gpu計(jì)算時(shí)間:', gtotal)
# gpu和cpu混合編程:
ggtime1 = time.time()
for g in range(1024):
gpu = gpu + gpu # 手工加法:+ 默認(rèn)回到cpu計(jì)算=!!鳄袍!
ggtime2 = time.time()
ggtotal = ggtime2 - ggtime1
print('混合的計(jì)算時(shí)間:', ggtotal)
三組循環(huán)矩陣相加的耗時(shí)結(jié)果:
純cpu計(jì)算時(shí)間: 43.857738733291626
純gpu計(jì)算時(shí)間: 0.02496480941772461
混合的計(jì)算時(shí)間: 1.4730699062347412
彼此差距非常明顯绢要!上文中需要注意的2、3點(diǎn)非常非常重要拗小!
由本例也可看出重罪,cupy的gpu并行計(jì)算潛力有多大!
本例的計(jì)算量還是太小哀九,一個(gè)GTX-1050的筆記本顯卡剿配,都根本還沒發(fā)揮其功力!如果將cupy應(yīng)用到服務(wù)器上阅束、應(yīng)用到深度學(xué)習(xí)之中呼胚,潛力非常大!
本文集會持續(xù)更新cupy的相關(guān)操作息裸,并實(shí)時(shí)將其與對應(yīng)的numpy使用進(jìn)行對比蝇更。
numpy教程網(wǎng)站
cupy教程網(wǎng)站