anchor.diff:          let res1 = Array.zeroCreate 10
           let res2 = Array.zeroCreate 20
   
  -        let m1 = processor1.PostAndReply(fun ch -> makeAllocateMsg(Allocate<_>(a1.Length, ch)))
  -        let m2 = processor1.PostAndReply(fun ch -> makeAllocateMsg(Allocate<_>(a2.Length, ch)))
  -
  -
  -        processor1.Post(makeToGPUMsg(ToGPU<_>(a1, m1)))
  -        processor2.Post(makeToGPUMsg(ToGPU<_>(a2, m2)))
  +        let m1 = gpu.Allocate(Msg.CreateAllocateMsg(Allocate<_>(a1.Length)))
  +        let m2 = gpu.Allocate(Msg.CreateAllocateMsg(Allocate<_>(a2.Length)))
  +
  +        processor1.Post(Msg.CreateToGPUMsg(ToGPU<_>(a1, m1)))
  +        processor2.Post(Msg.CreateToGPUMsg(ToGPU<_>(a2, m2)))
           //This code is unsafe because there is no synchronization between processors
           //It is just to show that we can share buffers between queues on the same device
  -        let res1 = processor2.PostAndReply(fun ch -> makeToHostMsg(ToHost<_>(m1, res1, ch)))
  -        let res2 = processor1.PostAndReply(fun ch -> makeToHostMsg(ToHost<_>(m2, res2, ch)))
  +        let res1 = processor2.PostAndReply(fun ch -> Msg.CreateToHostMsg(ToHost<_>(m1, res1, ch)))
  +        let res2 = processor1.PostAndReply(fun ch -> Msg.CreateToHostMsg(ToHost<_>(m2, res2, ch)))
   
           let result =
               res1,res2
  
positive.code:                             let length = a.Size
                              let buf = new Brahma.OpenCL.Buffer<_>(clContext, Brahma.OpenCL.Operations.ReadWrite, true, length)
                              let res = new GpuArray<'a>(buf,a.Size)
                              a.ReplyChannel.Reply res
                  }
  
      member private this.HandleToGPU (queue:Brahma.OpenCL.CommandQueue, toGpu:ToGPUCrate) =
          toGpu.Apply
  
negative.code:     member this.ReplyChannel = replyChannel
  
  
  type Allocate<'t>(size) =
      member this.Size = size
  type AllocateCrate =
      abstract member Apply : AllocateCrateEvaluator -> unit
  
  