与numpy相比,cupy代码不够快

时间:2019-08-16 23:14:34

标签: python cupy

我是Cupy的新手,为了比较执行时间,我一直在玩numpy和cupy。

import cupy 
import cupyx
import numpy as np
import time

def test_cupy(a0,a1,ind_i,ind_j):

        t1=time.time()
        for i in range(300):
            cupyx.scatter_add(a0,(ind_i,ind_j),cupy.exp(-(ind_i+ind_j)))
            cupyx.scatter_add(a1,(ind_i,ind_j),cupy.exp(-(ind_i+ind_j)))
        t2=time.time()
        print("cupy",t2-t1)
        return t2-t1

def test_numpy(a0,a1,ind_i,ind_j):

        t1=time.time()
        for i in range(300):
            np.add.at(a0,(ind_i,ind_j),np.exp(-(ind_i+ind_j)))
            np.add.at(a1,(ind_i,ind_j),np.exp(-(ind_i+ind_j)))
        t2=time.time()
        print("numpy",t2-t1)
        return t2-t1

a_np=np.zeros((20000,20000)) + 1
a_cp=cupy.zeros((20000,20000)) + 1

ind_np=np.arange(np.shape(a_np)[0])
ind_cp=cupy.arange(np.shape(a_np)[0])

t_cupy=test_cupy(a_cp,a_cp,ind_cp,ind_cp)
t_numpy=test_numpy(a_np,a_np,ind_np,ind_np)

print(t_numpy/t_cupy)

我有一个具有2560个内核的Geforce gtx 1080,时间比率t_numpy / t_cupy为18。比我所预期的要慢得多。我如何才能获得更好的表现?

1 个答案:

答案 0 :(得分:0)

(我建议您首先使用nvvp或Nsight对代码进行概要分析。)

该代码看起来不占用大量计算资源,因此内存读/写或内核启动成本将成为瓶颈。一种方法是使用cupy.fuse将元素操作融合到一个内核中。

@cupy.fuse
def exp_add_neg(ind_i, ind_j):
    return cupy.exp(-(ind_i + ind_j))

...
cupyx.scatter_add(a0, (ind_i, ind_j), exp_neg_add(ind_i, ind_j))
cupyx.scatter_add(a1, (ind_i, ind_j), exp_neg_add(ind_i, ind_j))

它使我的环境中的速度提高了约30%。