1
// https://devblogs.nvidia.com/parallelforall/optimizing-recurrent-neural-networks-cudnn-5/
// The last optimization from the above post. This is a sorting based implementation.
// I can't think of anything more elegant that a state machine at the moment

let wavefront_order =
    [|
    for x=0 to 49 do
        for y=0 to 9 do
            for z=0 to 9 do
                yield (x,y,z)
    |]
    |> Array.sortBy (fun (x,y,z) -> x+y+z)

実際のところ、原点からの距離でソートせずに再帰型 NN を実行しても機能しますが、それほど効率的ではありません。複数のストリームを使用すると、ウェーブフロントの順序でカーネルを起動しないと、Cuda スケジューラーが詰まってしまいます。

上記の NN が必要なこと、または F# の例は純粋にコンテキストのためです。

私は 2 次元でそれを行う方法を知っていますが、3D とそれ以上については、少しハックすることしか頭にありません。任意の次元の長さと次元数について、上記のソートベースのアプローチに似た波面反復を行うエレガントな方法があるかどうか疑問に思っていましたか?

4

1 に答える 1

2
let x_len = 49
let y_len = 9
let z_len = 9

let presort =
    [|
    for sum=0 to x_len+y_len+z_len do
        for x=0 to min sum x_len do
            for y=0 to min (sum-x) y_len do
                let z = sum-x-y
                if z <= z_len then yield (x,y,z)
                |]

これは美しく機能します。まさに私が欲しかったものです。ありがとう、ジョン・パーマー。

于 2016-04-24T13:31:18.817 に答える