Numpy 構文を使用した GPU プログラミングの奇跡にほかならない @cupy.fuse のデモをいくつか見ました。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