为什么numpy的执行时间比cupy快?

为什么numpy的执行时间比cupy快?,numpy,cupy,Numpy,Cupy,我在玩弄numpy和cupy之间的差异,并注意到在我创建的这两个类似程序中,cupy版本的速度要慢得多,尽管它是在GPU上运行的 以下是numpy版本: import time import numpy as np size = 5000 upperBound = 20 dataSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" dataLength = np.random.randint(0, high=

我在玩弄numpy和cupy之间的差异,并注意到在我创建的这两个类似程序中,cupy版本的速度要慢得多,尽管它是在GPU上运行的

以下是numpy版本:

import time
import numpy as np
size = 5000
upperBound = 20
dataSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
dataLength = np.random.randint(0, high=upperBound, size=size, dtype='l')
randomNumber = np.random.randint(0, high=62, size=size * upperBound, dtype='l')
count = 0
dataCount = 0
start_time = time.time()
for i in range(size):
    lineData = ""
    for j in range(dataLength[i]):
        lineData = lineData + dataSet[randomNumber[count]]
        count = count + 1
    print(lineData)
    dataCount = dataCount + 1
time = str(time.time() - start_time)
print("------------------------\n" + "It took this many sedonds: " + time)
print("There were " + str(dataCount) + " many data generations.")
这是丘比特的版本:

import time
import cupy as cp
size = 5000
upperBound = 20
dataSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
dataLength = cp.random.randint(0, high=upperBound, size= size,dtype='l')
randomNumber = cp.random.randint(0, high=62, size= upperBound * size,dtype='l')
count = 0
dataCount = 0
start_time = time.time()
for i in range(size):
    lineData = ""
    for j in range(int(dataLength[i])):
        lineData = lineData + str(dataSet[int(randomNumber[count])])
        count = count + 1
    print(lineData)
    dataCount = dataCount + 1
time = str(time.time() - start_time)
print("-------------------\n" +"It took this many seconds: " + time)
print("There were " + str(dataCount) + " many data generations.")
除了一个使用numpy,另一个使用cupy之外,它们本质上是相同的代码。我原以为cupy会因为GPU的使用而执行得更快,但事实并非如此。numpy的运行时间为:0.032。而cupy的运行时间为:0.484

  • 这是一个陷阱,抓住了许多新的GPU的人。一个程序的原始GPU版本比CPU版本慢是很常见的。使用GPU使代码快速运行并不是一件小事,主要是因为在GPU之间复制数据会有额外的延迟。无论你从使用GPU中获得什么加速,都必须首先克服这个开销。您在GPU上做的工作远远不够,无法使开销物有所值。在cp.random.randint()调用中,等待数据移动的时间远远超过实际计算的时间。在GPU上做更多的工作,你会看到GPU负责,比如在大型数据集上进行缩减操作

  • Numpy比您预期的要快得多,因为它是用优化良好的C编写的。它不是纯Python。因此,您试图击败的基准实际上相当快

  • <> >如果你真的想探索GPU性能优化的深度,试着编写一些CUDA,使用英伟达可视化剖析器来检查GPU到底在做什么。据说丘比特有钩子,但我从来没用过:


    我在这段代码中看不到用户定义的内核,因此它没有使用GPU进行任何重要的矩阵计算。因此,数据进出GPU的延迟和类型转换可能占主导地位。

    这是有道理的。非常感谢。为了从答案中澄清,这段代码在GPU上所做的唯一工作就是创建随机整数。其他一切都在CPU上,只需执行许多小操作即可将数据从GPU复制到CPU。