Beispiel #1
0
        private unsafe void TestGpuLayer(LayerBase <float> layer, TestDataSet <float> dataSet, int?outSize = null)
        {
            layer.Initialize(dataSet.BatchSize, dataSet.SampleCount);
            var gpuLayer = layer.CreateGpuLayer();

            int finalOutSize = outSize.GetValueOrDefault(dataSet.TargetSize);

            for (int step = 0; step < 3; step++) // Making 3 runs
            {
                var seq    = dataSet.GetNextSamples(dataSet.SampleCount);
                var cpuOut = new List <Matrix <float> >();
                layer.InitSequence();
                foreach (var input in seq.Inputs)
                {
                    cpuOut.Add(layer.Step(input));
                }

                var gpuOut = Enumerable.Range(0, dataSet.SampleCount).Select(x => Matrix <float> .Build.Dense(finalOutSize, dataSet.BatchSize)).ToArray();
                using (var inPtrs = new MatrixPointersBag <float>(true, seq.Inputs.ToArray()))
                    using (var outPtrs = new MatrixPointersBag <float>(true, gpuOut))
                    {
                        fixed(MatrixDefinition *inDef = &inPtrs.Definitions[0], outDef = &outPtrs.Definitions[0])
                        {
                            GpuInterface.LayerForwardSequence(gpuLayer, inDef, seq.Inputs.Count);
                            GpuInterface.TransferLayerOutputsToHost(gpuLayer, outDef, gpuOut.Length);
                        }
                    }

                //Console.WriteLine("CPU output:");
                //foreach (var matrix in cpuOut)
                //{
                //    Console.WriteLine(matrix.ToMatrixString());
                //    Console.WriteLine("---------------");
                //}

                //Console.WriteLine("GPU output:");
                //foreach (var matrix in gpuOut)
                //{
                //    Console.WriteLine(matrix.ToMatrixString());
                //    Console.WriteLine("---------------");
                //}

                //Console.WriteLine("================================");

                for (int sample = 0; sample < dataSet.SampleCount; sample++)
                {
                    cpuOut[sample].ShouldMatrixEqualWithinError(gpuOut[sample]);
                }
            }
        }