using System; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; static class MM { public static void MulSeq(int size, int[,] m1, int[,] m2, int[,] result) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { int tmp = 0; for (int k = 0; k < size; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } } } public static void MulPFor(int size, int[,] m1, int[,] m2, int[,] result) { Parallel.For(0, size, (int i) => { for (int j = 0; j < size; j++) { int tmp = 0; for (int k = 0; k < size; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } }); } public static void MulTask(int size, int[,] m1, int[,] m2, int[,] result) { Task[] tasks = new Task[size]; for (int n = 0; n < size; n++) { int i = n; tasks[n] = Task.Factory.StartNew(() => { for (int j = 0; j < size; j++) { int tmp = 0; for (int k = 0; k < size; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } Debug.WriteLine("done " + Task.CurrentId.ToString()); }); } Task.WaitAll(tasks); } public static void MulPool(int size, int[,] m1, int[,] m2, int[,] result) { ManualResetEvent signal = new ManualResetEvent(false); long iters = size; for (int n = 0; n < size; n++) { int i = n; ThreadPool.QueueUserWorkItem(_ => { for (int j = 0; j < size; j++) { int tmp = 0; for (int k = 0; k < size; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } if (Interlocked.Decrement(ref iters) == 0) signal.Set(); }); } signal.WaitOne(); } }