我想使用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
的求值。由于dot
的成本要低得多,因此它仍然比CPU上要快得多。
答案 0 :(得分:5)
在GPU上运行单个操作始终是一个坏主意。为了从GPU中获得性能提升,您需要实现良好的“计算强度”。即,相对于存储器的移动执行的计算量;从全局ram到gpu mem,或者从gpu mem到核心本身。如果每个字节的计算强度至少没有几个扑朔迷离的触发器,您可以放心地忘记在gpu上实现任何加速。也就是说,您的问题可能会助长GPU加速,但您当然不能以任何有意义的方式孤立地对此类语句进行基准测试。
但是,即使您的算法由在gpu上链接许多这样的简单的低计算强度运算组成,您仍然对加速感到失望。您的瓶颈将是您的gpu内存带宽;与cpu内存带宽相比,这确实没有那么大,因为它可能会在纸上看起来。除非您将要编写自己的计算密集型内核,或者没有计划使用Cupy运行一些大型fft,否则不要以为仅通过移植numpy代码就能给您带来任何子弹般的提速。
答案 1 :(得分:0)
我认为这里的问题是您仅利用一个GPU设备。考虑使用say 100并行执行所有for计算(尽管在您的简单示例代码中,它只需要执行一次)。 https://docs-cupy.chainer.org/en/stable/tutorial/basic.html
还有一个更大的功能,可以用来在GPU中进行比较
同样,第一次调用该点时,将需要为GPU编译内核函数,这将比随后的调用花费更长的时间。
答案 2 :(得分:-1)
这可能是因为使用CUDA时,必须在处理之前将阵列复制到GPU。因此,如果您的阵列只有一个元素,则在GPU中的速度可能会比在CPU中的速度慢。您应该尝试使用更大的数组,看看是否一直在发生