private static double RunVectorTriad(long vectorLength, long repetitions, int numberOfThreads) { GC.Collect(); GC.WaitForPendingFinalizers(); TriadData[] data = new TriadData[numberOfThreads]; for (int i = 0; i < numberOfThreads; i++) { data[i] = new TriadData(vectorLength); } IDummy dummy = DummyFactory.Get(); Task[] tasks = new Task[numberOfThreads]; for (int i = 0; i < numberOfThreads; i++) { int threadIndex = i; tasks[i] = new Task(() => RunVectorTriad(data[threadIndex], vectorLength, repetitions, dummy)); } Stopwatch stopwatch = Stopwatch.StartNew(); for (int i = 0; i < numberOfThreads; i++) { tasks[i].Start(); } Task.WaitAll(tasks.Take(numberOfThreads).ToArray()); stopwatch.Stop(); return((double)stopwatch.ElapsedMilliseconds / repetitions); }
private static void RunVectorTriad(TriadData data, long vectorLength, long repetitions, IDummy dummy) { fixed(double *ap = data.a) fixed(double *bp = data.b) fixed(double *cp = data.c) fixed(double *dp = data.d) { for (long r = 0; r < repetitions; r++) { if (ap[1] < 1) { dummy.DummyMethod(ap, bp, cp, dp); } for (long i = 0; i < vectorLength; i++) { long j = i;//(i * 1009) % vectorLength; ap[j] = bp[j] + cp[j] * dp[j]; } } } }