on master help sign in
Speed up im2col, vid2col.

Each point on the output is written to precisely once, so we don't need to initialise it or use an additive update modifier.

commitf04bfebfeef7e5e515295ecca57332f931b4823a authorHuw Campbell <huw.campbell@ambiata.com> dateMon 12 Dec 2016, 12:55 (10 years ago) parentbd881fa
1 file changed+4−4
src/Grenade/Layers/Internal/Convolution.hs+4−4
src/Grenade/Layers/Internal/Convolution.hs+4−4
@@ -127,7 +127,7 @@ vid2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dat
127127 numberOfPatches = length starts
128128 channels = length dataVid
129129
130− dataCol <- U.newMatrix 0 numberOfPatches (channels * kernelSize)
130+ dataCol <- U.newUndefinedMatrix U.RowMajor numberOfPatches (channels * kernelSize)
131131
132132 offsetC <- newSTRef 0
133133
@@ -140,7 +140,7 @@ vid2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dat
140140 forM_ [startRow .. startRow + kernelRows -1] $ \kr ->
141141 forM_ [startCol .. startCol + kernelColumns -1] $ \kc -> do
142142 inputColumn <- readSTRef inputColumnRef
143− unsafeModifyMatrix dataCol inputRow (inputColumn + offsetC') (+ U.atM' dataIm kr kc)
143+ U.unsafeWriteMatrix dataCol inputRow (inputColumn + offsetC') (U.atM' dataIm kr kc)
144144 modifySTRef' inputColumnRef (+1)
145145 modifySTRef' inputRowRef (+1)
146146
@@ -154,7 +154,7 @@ im2colUnsafe kernelRows kernelColumns striderows stridecols dataIm = U.runSTMatr
154154 kernelSize = kernelRows * kernelColumns
155155 numberOfPatches = length starts
156156
157− dataCol <- U.newMatrix 0 numberOfPatches kernelSize
157+ dataCol <- U.newUndefinedMatrix U.RowMajor numberOfPatches kernelSize
158158
159159 inputRowRef <- newSTRef 0
160160 forM_ starts $ \(startRow, startCol) -> do
@@ -163,7 +163,7 @@ im2colUnsafe kernelRows kernelColumns striderows stridecols dataIm = U.runSTMatr
163163 forM_ [startRow .. startRow + kernelRows -1] $ \kr ->
164164 forM_ [startCol .. startCol + kernelColumns -1] $ \kc -> do
165165 inputColumn <- readSTRef inputColumnRef
166− unsafeModifyMatrix dataCol inputRow inputColumn (+ U.atM' dataIm kr kc)
166+ U.unsafeWriteMatrix dataCol inputRow inputColumn (U.atM' dataIm kr kc)
167167 modifySTRef' inputColumnRef (+1)
168168 modifySTRef' inputRowRef (+1)
169169