首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cupy索引很慢

cupy索引很慢
EN

Stack Overflow用户
提问于 2020-05-02 21:24:46
回答 1查看 576关注 0票数 0

我试图对一个大小为16000的大立方体数组执行操作。我发现数学运算(如加法)速度相当快,但使用布尔掩码索引的速度相对较慢。例如,以下代码:

代码语言:javascript
复制
import cupy as cp
arr = cp.random.normal(0, 1, 16000)
%timeit arr * 5
%timeit arr > 0.4
%timeit arr[arr > 0.4] = 0

给我输出:

代码语言:javascript
复制
28 µs ± 950 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
26.5 µs ± 1.61 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
104 µs ± 2.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

为什么最终的索引速度至少是原来的两倍?我认为乘法应该比设置数组元素慢。

更新:对于numpy索引不是这样的。将cupy数组更改为numpy,我得到:

代码语言:javascript
复制
6.71 µs ± 373 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
4.42 µs ± 56.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.39 µs ± 29.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-02 22:25:01

在第三种情况下,cupy通过一系列操作组合结果:cupy_greatercupy_copyinclusive_scan_kernelinclusive_scan_kerneladd_scan_blocked_sum_kernelCUDA memcpy DtoH (可能是提供需要设置为零的元素数)、CUDA memset (可能将数组设置为零),最后是cupy_scatter_update_mask (可能将零分散到它们正确的位置)。

这是一个比arr*5要复杂得多的序列,它似乎在幕后运行了一个cupy_multiply。你也许可以用cupy user-defined kernel做得更好

代码语言:javascript
复制
import cupy as cp
clamp_generic = cp.ElementwiseKernel(
        'T x, T c',
        'T y',
        'y = (y > x)?c:y',
        'clamp_generic')
arr = cp.random.normal(0, 1, 16000)
clamp_generic(0.4, 0, arr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61566498

复制
相关文章

相似问题

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