public void Forwerd(R1dArray input, R2dArray w, out R1dArray u, out R1dArray o, Activator act) { u = new R1dArray(w.Height, input.Batch); o = new R1dArray(w.Height, input.Batch); var ipt = input << 1; var _u = u; var _o = (RNdArray)o; if (Option_F_01 != null) { Option_F_01.Startup(); using (Cloo.ComputeBuffer <float> __ipt = Option_F_01.ConvertBuffer(Cloo.ComputeMemoryFlags.ReadOnly, ipt.Data)) using (Cloo.ComputeBuffer <float> __w = Option_F_01.ConvertBuffer(Cloo.ComputeMemoryFlags.ReadOnly, w.Data)) using (Cloo.ComputeBuffer <float> __u = Option_F_01.ConvertBuffer(Cloo.ComputeMemoryFlags.WriteOnly, u.Data)) { Option_F_01.SetParameter(__ipt); Option_F_01.SetParameter(__u); Option_F_01.SetParameter(__w); Option_F_01.SetParameter(w.Width, Gpgpu.ProgramOption.ValueMode.INT); Option_F_01.SetParameter(w.Height, Gpgpu.ProgramOption.ValueMode.INT); Option_F_01.Execute(ipt.Batch, w.Height); Option_F_01.ReadBuffer(__u, ref u.Data); } } else { Parallel.For(0, ipt.Batch, b => { Parallel.For(0, w.Height, j => { for (int i = 0; i < w.Width; i++) { _u[j, b] += w[i, j] * ipt[i, b]; } }); }); } if (act != null) { act.Activation(u, ref _o); } else { Parallel.For(0, u.TotalLength, i => { _o.Data[i] = _u.Data[i]; }); } }