Python Cupy中的慢GPU比较

Python Cupy中的慢GPU比较,python,numpy,gpu,cupy,Python,Numpy,Gpu,Cupy,我想使用cupy测试浮点数是否为正值,例如: 作为cp导入cupy u=cp.array1.3 u>>阿雷特鲁 我的问题是这个操作非常慢: %时间u

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

作为cp导入cupy u=cp.array1.3 u<2。 >>>阿雷特鲁 我的问题是这个操作非常慢: %时间u<2。在我的电脑上显示26微秒。它比我在CPU中得到的要大几个数量级。我怀疑这是因为你必须在CPU上转换

我想找一个更快的方法来做这个手术

谢谢

编辑以澄清

我的代码类似于:

作为cp导入cupy n=100000 X=cp.random.randn可以更大 对于范围100中的uo:可能会有更多的迭代 结果=X.dotX 如果结果<1.2: 打破
对于这个n,这个代码的瓶颈似乎是对<1.2的结果的评估。它仍然比CPU快得多,因为点成本要低得多。

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

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


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

我认为这里的问题在于您只需利用一个GPU设备。考虑使用100表示并行计算,尽管在简单的示例代码中只需要执行一次。p> 此外,还有一个cupy更强大的功能,您可以使用它在GPU中进行比较


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

我的代码如下所示:X=cp.random.randint1e5;结果=X.dotX;如果结果<1:打印“成功”。对于这个过程来说,瓶颈实际上是令人沮丧的部分。我想知道如何解决这个问题。这里暗示的工作量绝对不值得为gpu而烦恼。调用内核的开销将远远超过在cpuThanks上运行此命令以获得帮助的时间。我已经测试过了,我用GPU编写的代码比用CPU编写的要快得多。但GPU的瓶颈是单个浮点的比较,这令人沮丧。我已经用一个例子编辑了我的原始帖子。你还为数组的大小增加了一个零,这确实使它在潜在的gpu加速领域处于边缘地位。但你可能没有对你认为你所做的进行基准测试。我想dot马上就回来了;只有IF语句返回到CPU的隐含拷贝触发了一个阻塞调用,等待GPU返回某个东西,然后剩下的唯一一件事就是将数据传输回CPU;或者更确切地说是它的开销,因为它是一个单元素数组。尝试将单个元素上载到gpu;这应该和复制一个文件的时间差不多。如果需要更长的时间,我会说用cupy.result提交一个bugreport在循环的每个周期中都有相同的值;很可能永远都是假的。这是预期的行为吗?这只是一个具有正确数量级的示例,实际代码实际上做了一些更有意义的事情。