与 numpy 相比,cupy 代码不够快

Posted

技术标签:

【中文标题】与 numpy 相比,cupy 代码不够快【英文标题】:cupy code is not fast enough compared with numpy 【发布时间】:2019-08-16 23:14:34 【问题描述】:

我是 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.. 比我预期的要慢得多。我怎样才能获得更好的性能?

【问题讨论】:

CuPy 的计算与主机异步运行,因此在停止计时器之前需要同步以正确测量计算时间。一种想法是在test_cupyt2=time.time() 上方(在for 循环之外)插入cupy.cuda.Device().synchronize() 感谢您的评论!!我做到了,速度是一样的!我该如何改进它? 【参考方案1】:

(我建议您从使用 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% 的速度。

【讨论】:

我用这个代码***.com/questions/58786923/…,我观察到numpy比cupy快,请你告诉我,为什么?

以上是关于与 numpy 相比,cupy 代码不够快的主要内容,如果未能解决你的问题,请参考以下文章

cupy或numpy中"数组"与"矩阵"的区别

用cupy(python)计算矩阵的行列式

将 cupy 转换为 numpy 非常慢

TypeError:不允许隐式转换为 NumPy 数组。请使用 `.get()` 显式构造 NumPy 数组。 -CuPy

把Numpy加速700倍?用 CuPy 吧!

Cupy的用处概述