Python 3.x 丘比特索引速度很慢

Python 3.x 丘比特索引速度很慢,python-3.x,performance,cupy,Python 3.x,Performance,Cupy,我正在尝试对16000大小的大型cupy阵列执行操作。我发现诸如加法之类的数学运算相当快,但使用布尔掩码进行索引的速度相对较慢。例如,以下代码: import cupy as cp arr = cp.random.normal(0, 1, 16000) %timeit arr * 5 %timeit arr > 0.4 %timeit arr[arr > 0.4] = 0 给我输出: 28 µs ± 950 ns per loop (mean ± std. dev. of 7 ru

我正在尝试对16000大小的大型cupy阵列执行操作。我发现诸如加法之类的数学运算相当快,但使用布尔掩码进行索引的速度相对较慢。例如,以下代码:

import cupy as cp
arr = cp.random.normal(0, 1, 16000)
%timeit arr * 5
%timeit arr > 0.4
%timeit arr[arr > 0.4] = 0
给我输出:

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,我得到:

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)

在第三种情况下,
cupy
通过一系列操作合成结果:
cupy\u更大的
cupy\u复制
inclusive\u扫描内核
inclusive\u扫描内核
添加扫描阻塞的求和内核
CUDA memcpy DtoH
(可能是为了提供需要设置为零的元素数量),
CUDA memset
(可能是为了将数组设置为零),最后是
cupy\u scatter\u update\u mask
(可能是为了将零分散到正确的位置)

这是一个比
arr*5
复杂得多的序列,它似乎在引擎盖下运行一个
cupy\u乘法

谢谢--这就解决了问题。在“clamp_generic”上运行“timeit”时,每个循环的时间仅为6.12µs±149 ns。
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)