using System; namespace Performance { public class Signal { /** * This is a dumb substitute for the real class for the purposes of benchmarking */ public Signal (int numRow, int numCol) { Random rand = new Random(); this.numRows = numRow; this.numCols = numCol; this.data = new double[numRow*numCol]; for (int i = 0 ; i < data.Length ; i++) data[i] = rand.NextDouble(); } public double[] data; public int numRows; public int numCols; } public class TestConvolution { public unsafe static void convolve (Signal Sa, Signal Sb, Signal So) { int La = Sa.numRows; int Lb = Sb.numRows; int nvar = Sa.numCols; double[] Va = Sa.data; double[] Vb = Sb.data; double[] Vo = So.data; // loop over variables for (int iv = 0 ; iv < nvar ; iv++) { // main convolution for (int i = 0 ; i < (La-Lb) ; i++) { double sig = 0; for (int j = 0 ; j < Lb ; j++) sig += Va[(i+j) * nvar + iv] * Vb[(Lb-j-1) * nvar + iv]; Vo [i*nvar + iv] = sig; } const double pad = 0; // boundary condition for (int i = Math.Max ((La-Lb), 0) ; i < La ; i++) { double sig = 0; for (int j = 0 ; j < Lb ; j++) { double v = ((i+j) < La) ? Va[(i+j) * nvar + iv] : pad; sig += v * Vb[(Lb-j-1) * nvar + iv]; } Vo [i * nvar + iv] = sig; } } } public static void Main (string[] argv) { const int signallen = 100000; const int nvar = 1; const int iterations = 2; Signal Sa = new Signal (signallen, nvar); Signal Sb = new Signal (signallen, nvar); Signal So = new Signal (signallen, nvar); Console.WriteLine ("starting evaluation"); DateTime Tstart = DateTime.Now; for (int i = 0 ; i < iterations ; i++) { convolve (Sa, Sb, So); } DateTime Tend = DateTime.Now; TimeSpan span = Tend - Tstart; Console.WriteLine (" timing: " + span); double sum = 0.0; for (int i = 0 ; i < So.data.Length ; i++) sum += So.data[i]; Console.WriteLine ("force evaluation: " + sum); } } }