为啥同时使用 numba.cuda 和 CuPy 从 GPU 传输数据这么慢?

     2023-02-16     166

关键词:

【中文标题】为啥同时使用 numba.cuda 和 CuPy 从 GPU 传输数据这么慢?【英文标题】:Why it is so slow to transfer data from GPU when use numba.cuda and CuPy at the same time?为什么同时使用 numba.cuda 和 CuPy 从 GPU 传输数据这么慢? 【发布时间】:2020-07-09 23:13:26 【问题描述】:

我从 Cupy 的文档中阅读了有关如何同时使用 cupy 和 numba 以及使用 cuda 加速代码的示例。 https://docs-cupy.chainer.org/en/stable/reference/interoperability.html

我写了一个类似的代码来测试它:

import cupy
from numba import cuda
import numpy as np
import time

@cuda.jit('void(float32[:], float32[:], float32[:])')
def add(x, y, out):
        start = cuda.grid(1)
        stride = cuda.gridsize(1)
        for i in range(start, x.shape[0], stride):
                out[i] = x[i] + y[i]


a = cupy.arange(10000000)
b = a * 2
out = cupy.zeros_like(a)

print("add function time consuming:")
s = time.time()
add(a, b, out)
e = time.time()
print(e-s)
s = time.time()
print("out[2]:")
print(out[2])
e = time.time()
print("the time of transfering out[2] out of GPU:")
print(e-s)

s = time.time()
new_OUT = a + b
print("new out[2] which only use cupy:")
print(new_OUT[2])
e = time.time()
print("the total time of running cupy addition and transfering new out[2] out of GPU:")
print(e-s)

输出是:

add function time consuming:
0.0019025802612304688
out[2]:
6
the time of transfering out[2] out of GPU:
1.5608515739440918
new out[2] which only use cupy:
6
the total time of running cupy addition and transfering new out[2] out of GPU:
0.002993345260620117

第一种情况下out[2]的调用怎么会这么慢?

我正在编写一些需要处理一些cupy数组和矩阵的函数。这些函数工作正常,但是在运行这些函数之后,当我需要进行一些修改时,甚至调用out.shape 之类的东西都非常慢(我的矩阵和数组非常庞大)。

我不确定这里发生了什么,因为 cupy 也使用 cuda,所以当我调用 a + b 时,它应该在 GPU 上运行,但是当我调用 out[2] 来检查 out[ 2]。但是第一种情况消耗超高。

【问题讨论】:

【参考方案1】:

要了解您的代码输出,至少需要注意两点:

    在 CUDA 中,通常配置内核启动以指示网格配置(块数,每个块的线程数)。 numba CUDA 内核启动通常会在内核参数之前的方括号中显示网格配置:

    kernel_name[grid_configuration](kernel_arguments)
    

    在 numba CUDA 中,省略方括号和网格配置在语法上是允许的,这具有[1,1](一个块,由一个线程组成)的网格配置的隐含含义。您的内核使用或多或少的任意网格配置,因为它使用grid-stride loop。然而,这并不意味着网格配置无关紧要。它对性能很重要。 [1,1] 的网格配置将提供令人沮丧的性能,并且永远不应该在性能很重要的 CUDA 内核启动中使用。因此,我们可以通过更改您的内核调用来纠正此问题,例如:

    add[1024,256](a, b, out)
    

    这将启动一个由 1024 个块组成的网格,每个块有 256 个线程。

    在 CUDA 中,内核启动是异步的。这意味着启动内核的主机代码将启动启动,但不会等待内核完成。这同样适用于 numba CUDA 内核启动。因此,内核启动本身的时间测量通常会令人困惑。出于计时目的,这可以通过强制 CPU 线程在计时区域内等待来调整,直到内核完成。在 numba CUDA 中,我们可以这样做:

    cuda.synchronize()
    

【讨论】:

感谢您提供完整的解释!

与 numba.cuda.to_device() 相比,使用 numba.cuda.local.array() 对性能有何影响?

】与numba.cuda.to_device()相比,使用numba.cuda.local.array()对性能有何影响?【英文标题】:Howisperformanceaffectedbyusingnumba.cuda.local.array()comparedwithnumba.cuda.to_device()?【发布时间】:2021-10-2211:00:18【问题描述】:在NumbaDocs:MemoryManagement下,对 查看详情

使用 Numba 进行矩阵乘法时出现 CUDA 内存不足错误

】使用Numba进行矩阵乘法时出现CUDA内存不足错误【英文标题】:CUDAoutofmemoryerrorwhendoingmatrixmultiplicationusingNumba【发布时间】:2021-07-0815:29:44【问题描述】:我需要将一个矩阵与其转置相乘,但我的GPU上的内存不足并出现错误消息n... 查看详情

可以在用户创建的 numba CUDA 设备函数中调用 numba.cuda.random 设备函数吗?

】可以在用户创建的numbaCUDA设备函数中调用numba.cuda.random设备函数吗?【英文标题】:Canyoucallthenumba.cuda.randomdevicefunctioninuser-creatednumbaCUDAdevicefunctions?【发布时间】:2022-01-0812:19:48【问题描述】:我在numba中有一个cuda内核和几个... 查看详情

即使对于巨型矩阵,NUMBA CUDA 也比并行 CPU 慢

...时间】:2020-11-1319:01:02【问题描述】:网上只有少数几个使用cuda进行numba的示例,我发现它们都比并行CPU方法慢。带有CUDA目标和模板的矢量化甚至更糟,所以我尝试创建一个自定义内核。您随处可见的一篇博文是https://gist.gith 查看详情

为啥cupy安装过程检测不到Microsoft Visual C++?

】为啥cupy安装过程检测不到MicrosoftVisualC++?【英文标题】:Whycan\'tthecupyinstallationprocessdetectMicrosoftVisualC++?为什么cupy安装过程检测不到MicrosoftVisualC++?【发布时间】:2020-07-2300:33:19【问题描述】:我目前正在尝试使用发布页面上... 查看详情

如何在 numba CUDA 中对行进行切片?

】如何在numbaCUDA中对行进行切片?【英文标题】:HowtoslicerowsinnumbaCUDA?【发布时间】:2021-08-1504:13:09【问题描述】:我是Numba的初学者。我很难在GPU中重新排列数组的行。例如,在NumbaCPU中,这可以通过fromnumbaimportnjitimportnumpyasnp@n... 查看详情

为啥我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢?

】为啥我系统上的所有CuPy函数都比它们的NumPy对应函数慢?【英文标题】:WhyareallCuPyfunctionsslowerthantheirNumPycounterpartsonmysystem?为什么我系统上的所有CuPy函数都比它们的NumPy对应函数慢?【发布时间】:2021-02-0212:10:01【问题描述】... 查看详情

为什么这个numba.cuda查找表实现失败?(代码片段)

...卡造成问题。但是下面的代码失败并出现未知错误:fromnumbaimportcuda,vectorizeimportnumpyasnptmp=np.random.uniform(0,100,1000000).astype(np.int16)tmp_device=cuda.to_device(tmp)lut 查看详情

为啥我的 Kmeans CuPy 代码中有“OutOfMemoryError”?

】为啥我的KmeansCuPy代码中有“OutOfMemoryError”?【英文标题】:Whydoihave"OutOfMemoryError"inmyKmeansCuPycode?为什么我的KmeansCuPy代码中有“OutOfMemoryError”?【发布时间】:2021-04-2313:47:04【问题描述】:我对gpu编码真的很陌生我发... 查看详情

使用 `cupy.nanstd` 和 `cupy.nanvar` 时的`TypeError`

】使用`cupy.nanstd`和`cupy.nanvar`时的`TypeError`【英文标题】:`TypeError`whenusing`cupy.nanstd`and`cupy.nanvar`【发布时间】:2019-12-0508:32:27【问题描述】:cupy在Windows10上运行以下代码时引发TypeError。importcupyascpprint(cp.nanstd(cp.asarray([1,2,3,4,5],dt 查看详情

cupy.RawModule 使用 name_expressions 和 nvcc 和/或路径

】cupy.RawModule使用name_expressions和nvcc和/或路径【英文标题】:cupy.RawModuleusingname_expressionsandnvccand/orpath【发布时间】:2020-10-2009:41:52【问题描述】:我正在使用CuPy测试库中的cuda内核。更具体地说,我使用cupy.RawModule来利用python中... 查看详情

Numba Cuda 计算似乎比顺序运行慢。我犯了明显的错误吗?

】NumbaCuda计算似乎比顺序运行慢。我犯了明显的错误吗?【英文标题】:NumbaCudacomputationseemstobeslowerthansequentialrun.DidIdoobviousmistakes?【发布时间】:2021-11-2905:44:49【问题描述】:有几个线程涵盖了类似的主题,但不幸的是,这些似... 查看详情

什么是 numba.cuda.local.array() 的有效替代方案,它们不像通过 to_device() 传递许多参数那么麻烦?

】什么是numba.cuda.local.array()的有效替代方案,它们不像通过to_device()传递许多参数那么麻烦?【英文标题】:Whatareefficientalternativestonumba.cuda.local.array()thataren\'tascumbersomeaspassingmanyargumentsviato_device()?【发布时间】:2021-10-2211:44:20【... 查看详情

无法使用 pip 安装 CuPy 和 PyTorch

】无法使用pip安装CuPy和PyTorch【英文标题】:UnabletoinstallCuPyandPyTorchusingpip【发布时间】:2019-07-2219:01:48【问题描述】:我正在尝试安装CuPy和PyTorch以运行依赖于两者的包。我的CUDA版本是10.1,但10.1的CuPy***给出了下面的错误消息。... 查看详情

如何指示 CuPy 在 GPU 中同时运行多个相同的作业?

】如何指示CuPy在GPU中同时运行多个相同的作业?【英文标题】:HowtoinstructCuPytorunmultiplenumberofthesamejobconcurrentlyinaGPU?【发布时间】:2020-09-0117:33:30【问题描述】:下面是一个名为job()的简单函数,它在GPU中执行多个CuPy任务。我如... 查看详情

为啥对 XML 同时使用 XSD 和 DTD?

】为啥对XML同时使用XSD和DTD?【英文标题】:WhyusebothXSDandDTDforXML?为什么对XML同时使用XSD和DTD?【发布时间】:2016-12-0805:58:43【问题描述】:***有几个很好的问题contrastingXSDandDTD和choosingbetweenXSDandDTD。但是我遇到了一种同时使用XS... 查看详情

为啥同时使用 conda 和 pip? [复制]

】为啥同时使用conda和pip?[复制]【英文标题】:Whyusebothcondaandpip?[duplicate]为什么同时使用conda和pip?[复制]【发布时间】:2021-05-2315:26:31【问题描述】:在这个article,作者建议如下要安装模糊匹配器,我发现conda安装更容易依赖... 查看详情

为啥需要同时使用 oBIX 和 CoAP

】为啥需要同时使用oBIX和CoAP【英文标题】:WhyoBIXandCoAPtogetherrequired为什么需要同时使用oBIX和CoAP【发布时间】:2016-01-2214:43:51【问题描述】:我正在开发一个楼宇自动化物联网系统,该系统同时具有oBIX和CoAP应用程序来提供Web服... 查看详情