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)

事实上,在不按与原点的距离对其进行排序的情况下运行循环神经网络是可行的,但远没有那么有效。使用多个流,如果我不按波前顺序启动内核,Cuda 调度程序会阻塞。

我需要上面的 NN,或者 F# 中的示例纯粹是为了上下文。

我知道如何处理二维,但对于 3D 和更多,我所想的只是有点 hacky。我想知道是否有一些优雅的方式来进行波前迭代,类似于上面针对任意维度长度和维度数量的基于排序的方法?

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 回答