private T Reduce <T>(UploadBuffer data, ReduceShader shader) where T : struct { Console.WriteLine("num groups: " + Utility.DivideRoundUp(data.ByteSize / 4, ReduceShader.ElementsPerGroup)); using (var buf = new GpuBuffer(4, data.ByteSize / 4)) { buf.CopyFrom(data); using (var timer = new GpuTimer()) { timer.Start(); //for(int i = 0; i < 100; ++i) shader.Run(buf, data.ByteSize / 4); timer.Stop(); Console.WriteLine(timer.GetDelta()); } using (var res = new DownloadBuffer(4)) { res.CopyFrom(buf, Marshal.SizeOf <T>()); var resData = res.GetData <T>(); return(resData); } } }