【问题标题】:CuPy - Does multiple functions result in multiple kernels?CuPy - 多个函数会导致多个内核吗?
【发布时间】:2021-06-11 23:03:52
【问题描述】:

我最近制作了numpy 代码的CuPy 版本,我只得到了x5-x15 的改进因子。当我检查我的 GPU 使用率时,它似乎很低(

一般来说,我想对cupy. ndarray 进行多次连续的CuPy 操作。 比如生成一个随机向量:

def randomUniformUnitary(N):
    theta = cp.random.rand(N) * 2 * cp.pi
    phi = cp.random.rand(N) * cp.pi
    x = cp.sin(phi) * cp.cos(theta)
    y = cp.sin(phi) * cp.sin(theta)
    z = cp.cos(phi)
    output = cp.stack((x, y, z), axis=-1)
    return output

我有多个the docs 似乎没有回答的问题。 (他们确实说动态内核创建,但没有解释)

  1. 内核合并?

CuPy 是否会为 rand() 创建一个内核,然后将数据发回并创建一个内核用于与 2 的乘法运算,然后... 或者所有这些计算会合并到一个更快的内核中吗?

  1. 内核组合标准?

如果是这样,导致这种行为的标准是什么?一线运营?相同的array 操作?函数操作? def 单独的函数是否可以在性能方面只对数组进行一个 cupy 操作,还是在某些地方重复编写代码并将所有的 Cupy 函数合并到一个 Python 函数中更好?

  1. 自己的内核?

如果每个计算都是单独进行的,并且没有“内核合并”,那么我觉得我可能应该制作自己的内核来优化?它是实现GPU优化的唯一途径吗?

【问题讨论】:

    标签: python cuda gpgpu cupy


    【解决方案1】:
    1. 一般来说,cupy 不会创建包含单独程序语句行为的单个内核。没有自动融合。 cupy 有一个fuse function,它适用于用户定义的内核(见下文)

    2. 见第 1 项

    3. 是的,您可以创建自己的内核。 Cupy 为您提供了多种创建user-defined kernels 的方法,这是将多个操作组合成单个底层内核调用的另一种可能的方法。

    您应该能够使用 GPU 分析器(或通过检查,因为 cupy 是开源的)进一步表征上述语句/行为。

    【讨论】:

    • 这确实回答了我的大部分问题,感谢您抽出宝贵的时间。如果我们说如果将多个操作合并到一个中,用户定义的内核会更快,因为 CPU 和 GPU 之间的数据共享会减少,我们通常是对的吗?
    • 我认为这可能是一个常见的观察结果。但是,cupy 知道您不想在 CPU 和 GPU 之间不必要地移动数据,典型的 cupy 语句序列不会这样做。 Cupy 旨在有意将数据保存在 GPU 上,直到 CPU 出现特定需求(例如,通过.asnumpy 语句)。内核融合的好处(“多个操作合并为一个”)并不依赖于消除不必要的 CPU/GPU 流量,而是一般性地描述为 here。它节省了内存带宽。
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2011-03-01
    • 1970-01-01
    • 2021-10-18
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多