首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何代替在CuPy中使用CuPy呢?

我应该如何代替在CuPy中使用CuPy呢?
EN

Stack Overflow用户
提问于 2019-11-04 15:23:37
回答 1查看 1.2K关注 0票数 2

如何将定义的函数应用于cupy.array而不是np.vectorize?类似的功能在cupy中已经实现了吗?

我正在用Python3.6.9编写模拟程序。

我想用GPU(GTX1060,NVIDIA)和CuPy(6.0.0 for CUDA10.1)进行仿真。

在原始代码中,函数numpy.vectorize用于将定义的函数应用于np.array。但是,相同的函数还没有在CuPy中实现。

原始代码(使用numpy)如下:

代码语言:javascript
复制
#For define function
def rate(tmean,x,y,z):
    rate = 1/z/(1 + math.exp(-x*(tmean-y)))
    #DVR<0
    if rate < 0:
        rate = 0
    return rate

#tmean is temperature data(365,100,100) and loaded as np.array
#paras is parameter(3,100,100)
#vectorized
f = np.vectorize(rate)
#roop
for i in range(365):
    #calc developing rate(by function "rate") and accumulate
    dvi[i,:,:] = dvi[i-1,:,:] + f(tmean[i,:,:],paras[0],paras[1],paras[2])

我知道numpy的几乎所有函数都是用CuPy实现的。所以我改变了

代码语言:javascript
复制
f = np.vectorized(rate) 

代码语言:javascript
复制
f= cp.vectorized(rate)

但发生了AttributeError。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 06:54:46

GPU不能并行处理任意Python代码。在与NumPy兼容的操作中编写所有内容,如

代码语言:javascript
复制
def rate_(xp, tmean,x,y,z):
    rate = 1/z/(1 + xp.exp(-x*(tmean-y)))
    rate[rate < 0] = 0
    return rate

f = functools.partial(rate_, xp=cupy)

为了加快速度,您可以使用cupy.ElementwiseKernel (https://docs-cupy.chainer.org/en/stable/tutorial/kernel.html),它为向量化操作创建一个内核。

代码语言:javascript
复制
f = cupy.ElementwiseKernel(
    'T tmean, T x, T y, T z',
    'T rate',
    '''
    rate = 1/z/(1 + exp(-x*(tmean-y)));
    // DVR<0
    if (rate < 0) {
        rate = 0;
    }
    '''
)

要从Python代码中创建内核,请尝试cupy.fuse

代码语言:javascript
复制
@cupy.fuse()
def f(tmean,x,y,z):
    rate = 1/z/(1 + cupy.exp(-x*(tmean-y)))
    return cupy.where(rate < 0, 0, rate)  # __setitem__ is not fully supported
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58696378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档