python - @cupy.fuse cupy python 装饰器在哪里记录?

标签 python numpy fuse cupy

我看过 @cupy.fuse 的一些演示,这对于使用 Numpy 语法进行 GPU 编程来说简直就是一个奇迹。 cupy 的主要问题是每个操作(例如添加)都是完整的内核启动,然后是内核释放。例如,一系列的加法和乘法会带来很多内核痛苦。 ( 这就是为什么使用 numba 可能会更好 @jit)

@cupy.fuse() 似乎通过将函数内的所有操作合并到单个内核来解决此问题,从而大大降低了启动和免费成本。

但是除了 cupy.fusion 类的演示和源代码之外,我找不到任何相关文档。

我的问题包括:

  1. 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

    最佳答案

    一些)答案:我已经找到了我在这里提出的一些问题的答案

    questions:

    1. fusing kernels is such a huge advance I don't understand when I would ever not want to use @fuse. isn't it always better? When is it a bad idea?

    答:Fuse 目前还不支持很多有用的操作。例如,z = cupy.empty_like(x) 不起作用,引用全局变量也不起作用。因此它根本无法普遍应用。

    I'm wondering about it's composability

    1. will @fuse inline the functions it finds within the decorated function?

    回答:查看时序和 nvvm 标记,它看起来确实会引入子例程并将它们融合到内核中。因此,将事物划分为子例程而不是整体代码将适用于fuse。

    1. I see that a bug fix in the release notes says that it can now handle calling other functions decorated with @fuse. But this does not say if their kernels are fused or remain separate.

    答案:查看 NVVM 输出,它们似乎已连接。很难说是否存在一些残余开销,但计时并没有显示出显着的开销,表明有两个单独的内核。关键是它现在可以工作了。从 cupy 4.1 开始,您无法从融合函数调用融合函数,因为返回类型错误。但从 5.1 开始你就可以了。但是您不需要装饰这些函数。无论您是否这样做,它都会起作用。

    1. Why isn't it documented?

    回答:它似乎有一些错误和一些不完整的功能。该代码还建议 API,因为它可能会发生变化。

    然而,当它可以使用时,这基本上是一个奇迹功能,可以轻松地将中小型阵列的速度提高一个数量级。因此,如果这个 alpha 版本也能被记录下来就好了。

    关于python - @cupy.fuse cupy python 装饰器在哪里记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53639723/

    相关文章:

    android - 'sizeof(off_t) != 8' 在为 android 编译 libfuse 时

    java -/usr/bin/ld : cannot find -ljvm:during compiling jni project

    python - fusion-python xmp.py - 无法创建文件

    python - numpy,用数组替换列

    python - Numpy 从矩阵中提取行、列和值

    python - 如何迭代 QGroupBox 中的所有 QPushButton

    python - 如何获取标签下的文字

    python - matplotlib 中的误差线显示在其他曲线上

    python - 如何计算列表中元素的数量并创建新列?

    python - 没有默认值的可选参数