我看过一些@cupy.fuse 的演示,这对于使用 Numpy 语法进行 GPU 编程来说简直就是一个奇迹。Cupy 的主要问题是像添加这样的每个操作都是一个完整的内核启动,然后是内核释放。所以一系列的加法和乘法,例如,付出了很多内核的痛苦。(这就是为什么使用 numba @jit 可能会更好)
@cupy.fuse() 似乎通过将函数内的所有操作合并到单个内核来解决这个问题,从而大大降低了启动和免费成本。
但除了cupy.fusion 类的演示和源代码之外,我找不到任何文档。
我的问题包括:
- Cupy.fuse 是否会积极内联在应用装饰器的函数内调用的任何 python 函数,从而将它们滚动到同一个内核中?
这个增强日志提示了这一点,但没有说明组合函数是否在同一个内核中,或者只是在调用函数也被修饰时才允许。 https://github.com/cupy/cupy/pull/1350
如果是这样,我需要用@fuse 装饰这些功能吗?我认为这可能会损害内联而不是帮助它,因为它可能会将这些函数呈现为不可融合(可能是非 python)的形式。
如果没有,我是否可以通过首先用@numba.jit 装饰函数然后用@fuse 装饰来实现自动内联。或者@jit 会再次以不可融合的形式呈现生成的 python 吗?
什么破坏了@fuse?有哪些陷阱?@fuse 是实验性的,不太可能维护吗?
参考:
https://gist.github.com/unnonouno/877f314870d1e3a2f3f45d84de78d56c
https://www.slideshare.net/pfi/automatically-fusing-functions-on-cupy
https://github.com/cupy/cupy/blob/master/cupy/core/fusion.py
https://docs-cupy.chainer.org/en/stable/overview.html
https://github.com/cupy/cupy/blob/master/cupy/manipulation/tiling.py