首页 > 解决方案 > CuPy - 多个函数会导致多个内核吗?

问题描述

我最近制作了我的代码的一个CuPy版本,numpy我只得到了 x5-x15 的改进因子。当我检查我的 GPU 使用率时,它似乎很低(<1%)。我想优化我的代码运行方式以获得更快的结果。

通常,我想CuPycupy. ndarray. 例如,生成一个随机向量:

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

我有多个文档似乎没有回答的问题。(他们确实说即时内核创建,但没有解释)

  1. 内核合并?

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

  1. 内核组合标准?

如果是这样,导致这种行为的标准是什么?一线运营?一样的array操作?函数操作?在性能方面是否可以仅对数组进行def一次操作来分离函数,还是在某些地方双重编写代码并将所有 Cupy 函数放入一个 Python 函数中更好?cupy

  1. 自己的内核?

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

标签: pythoncudagpgpucupy

解决方案


  1. 一般来说,cupy 不会创建包含单独程序语句行为的单个内核。没有自动融合。Cupy 有一个fuse 函数,适用于用户定义的内核(见下文)

  2. 见第 1 项

  3. 是的,您可以创建自己的内核。cupy 为您提供了多种方法来创建用户定义的内核,这是将多个操作组合成单个底层内核调用的另一种可能的方法。

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


推荐阅读