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