Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/high-to-mid/probe.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/high-to-mid/probe.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3071, Sun Mar 15 00:09:44 2015 UTC revision 3072, Sun Mar 15 16:33:00 2015 UTC
# Line 27  Line 27 
27      structure DstOp = MidOps      structure DstOp = MidOps
28      structure DstV = DstIL.Var      structure DstV = DstIL.Var
29      structure VMap = SrcIL.Var.Map      structure VMap = SrcIL.Var.Map
30        structure BCtl = BorderCtl
31      structure IT = Shape      structure IT = Shape
32    
33    (* generate a new variable indexed by dimension *)    (* generate a new variable indexed by dimension *)
# Line 121  Line 122 
122              coeffCode @ reduceCode              coeffCode @ reduceCode
123            end            end
124    
125      fun doVoxelSample (result, v, k, s, diffIter, {h, n, f, img}, offset) = let      fun loadVoxelVec (vox, v, offset, s, img, indices, BCtl.None) = let
126              val a = DstV.new ("a", DstTy.AddrTy v)
127              in [
128                assign(a, DstOp.VoxelAddress(v, offset), img::indices),
129                assign(vox, DstOp.LoadVoxels(v, 2*s), [a])
130              ] end
131          | loadVoxelVec (vox, v, offset, s, img, indices, BCtl.Default x) = raise Fail "Border control default"
132          | loadVoxelVec (vox, v, offset, s, img, indices, BCtl.Index ictl) = let
133              val numVoxels = 2*s
134            (* split the indices into a reverse-order prefix and the last index *)
135              val (revIndices, baseIdx) = let
136                    fun split ([i], prefix) = (prefix, i)
137                      | split (idx::idxs, prefix) = split (idxs, idx::prefix)
138                    in
139                      split (indices, [])
140                    end
141              fun mk (i, voxs, stms) = if (i < numVoxels)
142                    then let
143                      val (indices, stms) = if (i = 0)
144                            then (indices, stms)
145                            else let
146                              val idx = DstV.new ("idx", DstTy.IntTy)
147                              val n = DstV.new ("n", DstTy.IntTy)
148                              val stms = assign(idx, DstOp.Add DstTy.IntTy, [baseIdx, n]) ::
149                                    intLit(n, i) :: stms
150                              in
151                                (List.revAppend(revIndices, [idx]), stms)
152                              end
153                      val a = DstV.new ("a", DstTy.AddrTy v)
154                      val addrStm = assign(a, DstOp.VoxelAddressWithCtl(v, offset, ictl), img::indices)
155                      val vox = DstV.new ("vox", DstTy.realTy)
156                      val loadStm = assign(vox, DstOp.LoadVoxels(v, 1), [a])
157                      in
158                        mk (i+1, vox::voxs, loadStm :: addrStm :: stms)
159                      end
160                    else List.rev(cons(vox, List.rev voxs) :: stms)
161              in
162                mk (0, [], [])
163              end
164    
165        fun doVoxelSample (result, v, k, s, diffIter, {h, n, f, img}, offset, ctl) = let
166            val stride = ImageInfo.stride            val stride = ImageInfo.stride
167            val dim = ImageInfo.dim v            val dim = ImageInfo.dim v
168            val vecsTy = DstTy.vecTy(2*s) (* vectors of coefficients cover support of kernel *)            val vecsTy = DstTy.vecTy(2*s) (* vectors of coefficients cover support of kernel *)
# Line 161  Line 202 
202                              end                              end
203                        val (indices, indicesCode) = computeIndices (0, offsets)                        val (indices, indicesCode) = computeIndices (0, offsets)
204                        val a = DstV.new ("a", DstTy.AddrTy v)                        val a = DstV.new ("a", DstTy.AddrTy v)
205                          val loadStms = loadVoxelVec (vox, v, offset, s, img, indices, ctl)
206                        in                        in
207                          indicesCode @ [                          indicesCode @ loadStms @ code
                             assign(a, DstOp.VoxelAddress(v, offset), img::indices),  
                             assign(vox, DstOp.LoadVoxels(v, 2*s), [a])  
                           ] @ code  
208                        end                        end
209                  in                  in
210                    IT.foldr genCode [] voxIter                    IT.foldr genCode [] voxIter
# Line 242  Line 281 
281            val vars = {h=h, n=n, f=f, img=img}            val vars = {h=h, n=n, f=f, img=img}
282            in            in
283              case ImageInfo.voxelShape v              case ImageInfo.voxelShape v
284               of [] => toImgSpaceCode @ doVoxelSample (result, v, k, s, diffIter(), vars, 0)               of [] => toImgSpaceCode @ doVoxelSample (result, v, k, s, diffIter(), vars, 0, ctl)
285                | shape => let                | shape => let
286                  (* the result will be a d1 x d2 matrix of k-order tensors; each element of the matrix                  (* the result will be a d1 x d2 matrix of k-order tensors; each element of the matrix
287                   * has the sampleTy = tensor[dim,...,dim].                   * has the sampleTy = tensor[dim,...,dim].
# Line 259  Line 298 
298                            List.foldr (fn (x, (off, cd)) => gen(x, dd, off, cd)) (offset, code) xs                            List.foldr (fn (x, (off, cd)) => gen(x, dd, off, cd)) (offset, code) xs
299                          end                          end
300                      | gen (y, [], offset, code) =                      | gen (y, [], offset, code) =
301                          (offset-1, doVoxelSample (y, v, k, s, diffIter(), vars, offset) @ code)                          (offset-1, doVoxelSample (y, v, k, s, diffIter(), vars, offset, ctl) @ code)
302                    val (_, code) = gen (result, shape, ImageInfo.stride v - 1, [])                    val (_, code) = gen (result, shape, ImageInfo.stride v - 1, [])
303                    in                    in
304                      toImgSpaceCode @ code                      toImgSpaceCode @ code

Legend:
Removed from v.3071  
changed lines
  Added in v.3072

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0