0

我想使用cupy测试浮点数是否为正,例如:

import cupy as cp

u = cp.array(1.3)
u < 2.
>>> array(True)

我的问题是这个操作非常慢: %timeit u < 2.在我的电脑上给出 26 微秒。它比我在 CPU 中得到的要大几个数量级。我怀疑这是因为你必须被投到CPU上......

我正在尝试找到一种更快的方法来执行此操作。

谢谢 !

编辑澄清

我的代码是这样的:

import cupy as cp
n = 100000
X = cp.random.randn(n)  # can be greater
for _ in range(100):  # There may be more iterations
    result = X.dot(X)
    if result < 1.2:
        break

似乎这段代码的瓶颈(对于 this n)是对result < 1.2. 它仍然比 CPU 快得多,因为dot成本要低得多。

4

3 回答 3

7

在 GPU 上运行单个操作总是一个坏主意。要从 GPU 中获得性能提升,您需要实现良好的“计算强度”;也就是说,相对于内存移动执行的计算量;从全局 ram 到 gpu mem,或者从 gpu mem 到内核本身。如果每个字节的计算强度没有至少几百次触发器,那么您可以放心地忘记在 gpu 上实现任何加速。也就是说,您的问题可能会导致 gpu 加速,但您当然不能以任何有意义的方式孤立地对这样的语句进行基准测试。

但是,即使您的算法包含在 gpu 上链接许多此类简单的低计算强度操作,您仍然会对加速感到失望。您的瓶颈将是您的 gpu 内存带宽;与 cpu 内存带宽相比,这真的不是那么好,因为它可能看起来在纸上。除非您将编写自己的计算密集型内核,或者计划使用 cupy 运行一些大型 ffts 等,否则不要认为仅通过移植您的 numpy 代码就可以为您带来任何银弹加速。

于 2019-02-19T15:12:34.427 回答
0

这可能是因为,在使用 CUDA 时,必须在处理之前将数组复制到 GPU。因此,如果您的数组只有一个元素,那么它在 GPU 中的速度可能比在 CPU 中慢。你应该尝试一个更大的数组,看看这是否继续发生

于 2019-02-19T15:09:02.753 回答
0

我认为这里的问题是您只利用了一个 GPU 设备。考虑使用 say 100 并行执行所有 for 计算(尽管在您的简单示例代码的情况下,它只需要执行一次)。https://docs-cupy.chainer.org/en/stable/tutorial/basic.html

还有一个更大的函数可以用来在 GPU 中进行比较

此外,第一次调用点时,需要为 GPU 编译内核函数,这将比后续调用花费更长的时间。

于 2019-08-16T14:08:10.053 回答