如何解决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 似乎没有回答。 (他们确实说即时内核创建,但没有解释)
- 内核合并?
CuPy 是否会为 rand()
创建一个内核,然后将数据发回并创建一个用于乘法 2
的内核,然后……或者所有这些计算会合并成一个更快的内核?
- 内核组合标准?
如果是这样,导致这种行为的标准是什么?单线操作?相同的 array
操作?函数操作? def
单独的函数在数组上只执行一个 cupy
操作是否可以提高性能,还是最好在某些地方重复编写代码并将所有cupy 函数放入一个Python 函数中?
- 自己的内核?
如果每个计算都是单独完成的,没有“内核合并”,那么我觉得我应该自己做内核来优化吗?这是实现GPU优化的唯一途径吗?
解决方法
-
一般来说,cupy 不会创建包含单独程序语句行为的单个内核。没有自动融合。 cupy 有一个 fuse function,适用于用户定义的内核(见下文)
-
查看项目 1
-
是的,您可以创建自己的内核。 cupy 为您提供了多种创建 user-defined kernels 的方法,这是将多个操作组合到单个底层内核调用中的另一种可能方法。
您应该能够使用 GPU 分析器(或通过检查,因为 cupy 是开源的)进一步表征上述陈述/行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。