anchor.diff:              new MapReduce<'a, 'b>(runtime, reducer, map, add)
           )
   
  +    let getImageMapReducer (map : Expr<V3i -> V4f -> 'b>) (add : Expr<'b -> 'b -> 'b>) =
  +        mapReduceCache.GetOrCreate(map, add, fun map add -> 
  +            let reducer = getReducer add
  +            new MapReduceImage<'b>(runtime, reducer, map, add)
  +        )
   
       member x.CompileScan(add : Expr<'a -> 'a -> 'a>, input : IBufferVector<'a>, output : IBufferVector<'a>) =
           let scanner = getScanner add
  
positive.code:                     outputData.[oid] <- (%add) inputData.[iid] outputData.[oid]
  
          }
        
  
      let inputImage =
          sampler2d {
              texture uniform?InputTexture
              filter Filter.MinMagMipPoint
              addressU WrapMode.Clamp
              addressV WrapMode.Clamp
          }
  
      [<LocalSize(X = halfScanSize)>]
      let reduceKernel (add : Expr<'a -> 'a -> 'a>) (inputData : 'a[]) (outputData : 'a[]) =
  
negative.code:         let reducer = getMapReducer map add
          reducer.Run(input)
  
      member x.MapReduce(map : Expr<V3i -> V4f -> 'b>, add : Expr<'b -> 'b -> 'b>, input : ITextureSubResource) =
          let reducer = getImageMapReducer map add
          reducer.Run(input)
          
      member x.Map(map : Expr<int -> 'a -> 'b>, input : IBufferVector<'a>, output : IBufferVector<'b>) =
          let mapper = getMapper map
          mapper.Run(input, output)
  
  