我想使用cupy测试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
似乎该代码的瓶颈(对于此n
)是result < 1.2
的评估。它仍然比CPU快得多,因为dot
的成本较低。
在GPU上运行一个操作总是一个坏主意。为了从GPU中获得性能提高,您需要实现良好的"计算强度";也就是说,相对于记忆运动的计算量;从全球RAM到GPU MEM,或从GPU MEM到核心本身。如果您至少没有计算强度的小字节的hunderd拖鞋,那么您可以忘记意识到GPU上的任何加速。这就是说您的问题可能会使GPU加速,但您当然不能以任何有意义的方式孤立地基准这样的陈述。
但是,即使您的算法也包括在GPU上链接许多如此简单的低计算强度操作,您仍然会对加速感到失望。您的瓶颈将是您的GPU内存带宽;与CPU内存带宽相比,这实际上并不是很棒的,因为它可能会在纸上看。除非您要编写自己的Compute-Intense内核,或者有计划运行一些大FFT或使用Cupy的计划,否则不要以为它会通过移植您的numpy代码来为您提供任何银色bullet速度。
这可能是因为,当使用CUDA时,必须在处理之前将数组复制到GPU。因此,如果您的数组只有一个元素,则在GPU中,它比在CPU中慢。您应该尝试一个较大的数组,看看是否一直在发生
我认为这里的问题是您只是利用一个GPU设备。考虑使用Say 100并行执行所有计算(尽管在您的简单示例代码的情况下,只需要一次需要一次)。https://docs-cupy.chainer.org/en/stable/tutorial/basic.html
还可以使用杯子更大的功能来进行GPU
中的比较还需要为GPU编译DOT首次调用内核函数,这将比随后的调用大得多。