CuPy - 多个函数是否会导致多个内核?

CuPy - Does multiple functions result in multiple kernels?

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

一般来说,我想对 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优化的唯一途径吗?

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

  2. 见第 1 项

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

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