微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决CuPy - 多个函数会导致多个内核吗?

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

通常,我想对 CuPy 进行多个连续的 cupy. 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

我有多个问题 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 是开源的)进一步表征上述陈述/行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。