예제 #1
0
        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];
                });
            }
        }