static void Mul(InputData data, Port<int> resp) { long Result = 0; int i = 0; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); Random r = new Random(); for (int j = 0; j < n; j++) { a[j] = r.Next(1, 3); b[j] = r.Next(1, 3); } long ResultA = 1; long ResultB = 1; long Res = 0; sWatch.Start(); for (i = data.start; i <= data.stop; i++) { ResultA = ResultA * a[i]; ResultB = ResultB * b[i]; ResultA = ResultA / 25; ResultArr[i] = ResultA + ResultB; Res = Res + ResultArr[i]; } sWatch.Stop(); resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void Main(string[] args) { int outer,i=0; nc = 4; n = 10000001; float sum = 0; a = new int[n]; b = new int[nc]; Random r = new Random(); for (int j = 0; j < n; j++) a[j] = r.Next(100); System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (outer = 0; outer < n; outer++) { sum += a[outer]; } sWatch.Stop(); Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); Console.WriteLine("Среднее в последовательном={0}",Math.Round(( sum / n),0) + " "); // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (i = 0; i < nc; i++) ClArr[i] = new InputData(); // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; ClArr[i].i = i; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { })); }
static void Mul(InputData data, Port<int> resp) { int i; double Pi = 0,dx=0,x=0; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); dx = 1 / 10000000.0; x = data.start / 10000000.0; for (i = data.start; i <= data.stop; i++) { Pi += Math.Sqrt(1 - x * x)*4*dx; x += dx; } Console.WriteLine("часть Pi №{0} = {1}", Thread.CurrentThread.ManagedThreadId,Pi); sWatch.Stop(); resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void Mul(InputData data, Port<int> resp) { int i, j; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (i = data.start; i <= data.stop-1; i++) { for (j = i+1; j <= data.stop; j++) { if (a[j] < a[i]) //сортировка пузырьком { var temp = a[i]; a[i] = a[j]; a[j] = temp; } } } //внимательно присмотревшись к этой функции и к условиям, в которых она вызывается, можно сделать вывод //что она вернет массив, состоящий из двух сортированных половинок, но не сортированный целиком //так оно и есть, потому что параллельный пузырек - необычная задумка //в данной лабораторной работе эта проблема решается в делегате, описанном в приемнике, штатными средствами C# sWatch.Stop(); resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void Mul(InputData data, Port<int> resp) { int Result = 0; int i = 0; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); Random r = new Random(); for (int j = 0; j < n; j++) a[j] = r.Next(5); sWatch.Start(); for (i = data.start; i <= data.stop; i++) { Result = Result + a[i]; } resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); sWatch.Stop(); Console.WriteLine("Сумма:"); Console.WriteLine(Result); }
static void ParallelMul() { InputData[] ClArr = new InputData[nc]; for (int i = 0; i < nc; i++) ClArr[i] = new InputData(); int step = (Int32)(m / nc); int c = -1; for (int i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (int i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate (int[] array) { Console.WriteLine("Вычисления завершены"); Console.ReadKey(true); Environment.Exit(0); })); }
static void Main(string[] args) { double Pi = 0, dx = 0, x = 0; int outer,i=0; nc = 4; n = 10000000; dx = 1 / 10000000.0; x = 0; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (outer = 0; outer < n; outer++) { Pi += Math.Sqrt(1 - x * x) ; x += dx; } Pi = Pi * 4 * dx; sWatch.Stop(); Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); Console.WriteLine("Пи в последовательном={0}",Pi + " "); // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (i = 0; i < nc; i++) ClArr[i] = new InputData(); // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; ClArr[i].i = i; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { })); }
static void ParallelIntegration(dynamic step, dynamic Low, dynamic Up, ScriptScope scope) { // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (int i = 0; i < nc; i++) ClArr[i] = new InputData(); //Далее, задаются исходные данные для каждого экземпляра //вычислительного метода: // заполняем массив параметров dynamic Low_temp = Low; for (int i = 0; i < nc; i++) { ClArr[i].start = Low_temp; if (i + 1 == nc) ClArr[i].stop = Up; else ClArr[i].stop = Low_temp + step; Low_temp = Low_temp + step; } //Создаётся диспетчер с пулом из двух потоков: Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); //Описывается порт, в который каждый экземпляр метода Int() //отправляет сообщение после завершения вычислений: Port<int> p = new Port<int>(); //Метод Arbiter.Activate помещает в очередь диспетчера две задачи(два //экземпляра метода Mul): System.Diagnostics.Stopwatch ssWatch = new System.Diagnostics.Stopwatch(); ssWatch.Start(); for (int i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>, ScriptScope>(ClArr[i], p, scope, Int)); //Первый параметр метода Arbiter.Activate – очередь диспетчера, //который будет управлять выполнением задачи, второй параметр – //запускаемая задача. //С помощью метода Arbiter.MultipleItemReceive запускается задача //(приёмник), которая обрабатывает получение двух сообщений портом p: Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate (int[] array) { Console.WriteLine("Вычисления завершены"); ssWatch.Stop(); Console.WriteLine("Полное время работы {0} мс", ssWatch.ElapsedMilliseconds.ToString()); Console.ReadKey(true); Environment.Exit(0); })); Console.ReadKey(true); Environment.Exit(0); }
static void Main(string[] args) { int i, min,max; nc = 2; // количество ядер n = 100000000; // количество элементов в массиве A = new int[n]; B = new int[nc]; Random r = new Random(); // генирируем массив for (int j = 0; j < n; j++) A[j] = r.Next(100); System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); // запуск секундомера min = A[0]; for (i = 1; i < n; i++) { if (A[i] < min) min = A[i]; } max = A[0]; for (i = 1; i < n; i++) { if (A[i] > max) max = A[i]; } Console.WriteLine(min); Console.WriteLine(max); sWatch.Stop(); // отключение секундомера Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (i = 0; i < nc; i++) ClArr[i] = new InputData(); // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; ClArr[i].i = i; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); // диспетчер с nc потоками в пуле DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { }));}}}
static void Mul(InputData data, Port<int> resp) { int min2 = A[0], max2 = A[0], i; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); // запуск секундомера for (i = data.start; i <= data.stop; i++) { if (A[i] < min2) min2 = A[i]; if (A[i] > max2) max2 = A[i]; } sWatch.Stop(); // отключение секундомера resp.Post(1); Console.WriteLine(min2); Console.WriteLine(max2); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void ParallelMul() { // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (int i = 0; i < nc; i++) ClArr[i] = new InputData(); //Далее, задаются исходные данные для каждого экземпляра //вычислительного метода: // делим количество строк в матрице на nc частей int step = (Int32)(m / nc); // заполняем массив параметров int c = -1; for (int i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; c = c + step; } //Создаётся диспетчер с пулом из двух потоков: Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); //Описывается порт, в который каждый экземпляр метода Mul() //отправляет сообщение после завершения вычислений: Port<int> p = new Port<int>(); //Метод Arbiter.Activate помещает в очередь диспетчера две задачи(два //экземпляра метода Mul): for (int i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); //Первый параметр метода Arbiter.Activate – очередь диспетчера, //который будет управлять выполнением задачи, второй параметр – //запускаемая задача. //С помощью метода Arbiter.MultipleItemReceive запускается задача //(приёмник), которая обрабатывает получение двух сообщений портом p: Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate (int[] array) { Console.WriteLine("Вычисления завершены"); Console.ReadKey(true); Environment.Exit(0); })); }
static void Mul(InputData data, Port<int> resp) { int i, j; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (i = data.start; i <= data.stop; i++) { for (j = i; i <= data.stop; i++) { if (a[j] > a[j+1]) { int b = a[j]; //change for elements a[j] = a[j+1]; a[j+1] = b; } } } sWatch.Stop(); resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void Mul(InputData data, Port<int> resp) { int i; float sum = 0; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (i = data.start; i <= data.stop; i++) { sum += a[i]; } Console.WriteLine("Среднее в потоке №{0} = {1}", Thread.CurrentThread.ManagedThreadId, Math.Round((sum / n), 0)); sWatch.Stop(); resp.Post(1); Console.WriteLine("Поток № {0}: Параллельный алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); }
static void Mul(InputData data, Port<int> resp) { System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (int i = data.start; i < data.stop; i++) { C[i] = 0; for (int j = 0; j < n; j++) C[i] += A[i, j] * B[j]; } sWatch.Stop(); Console.WriteLine("Поток № {0}: Паралл. алгоритм = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); resp.Post(1); }
static void Main(string[] args) { int i; nc = 2; n = 50000; Console.WriteLine("\nМассив включает в себя {0} элементов\n", n); a = new int[n]; mem = new int[n]; b = new int[nc]; Random r = new Random(); for (int j = 0; j < n; j++) a[j] = r.Next(10000); a.CopyTo(mem,0); //запомнили полученный массив Console.WriteLine("Исходный массив успешно заполнен случайными значениями!\n"); arrDisplay(); System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); Console.WriteLine("Начата последовательная сортировка массива...\n"); sWatch.Start(); for (i = 0; i <= n - 1; i++) { for (int j = i + 1; j < n; j++) { if (a[j] < a[i]) { var temp = a[i]; a[i] = a[j]; a[j] = temp; } } } sWatch.Stop(); Console.WriteLine("Массив отсортирован последовательным алгоритмом!\n"); Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); arrDisplay(); //показали отсортированный массив mem.CopyTo(a, 0); ; // восстановили массив со случайными числами // создание массива объектов для хранения параметров InputData[] tempArray = new InputData[nc]; i = 0; while (i < nc) {tempArray[i] = new InputData(); i++;} // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { tempArray[i].start = c + 1; tempArray[i].stop = c + step; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(tempArray[i], p, Mul)); Console.WriteLine("Начата параллельная сортировка массива...\n"); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { Console.WriteLine("Массив отсортирован параллельным алгоритмом!\n"); System.Diagnostics.Stopwatch newWatch = new System.Diagnostics.Stopwatch(); Console.WriteLine("Начата последовательная сортировка массива...\n"); newWatch.Start(); Array.Sort(a); //тот самый делегат в приемнике, с помощью которого шлейфуется результат параллельной сортировки пузырьком newWatch.Stop(); Console.WriteLine("Окончательная сортировка средтвами C#: {0} мс.\n", newWatch.ElapsedMilliseconds.ToString()); arrDisplay(); Console.WriteLine("Вычисления завершены"); Console.ReadKey(true); Environment.Exit(0); })); }
static void Int(InputData data, Port<int> resp, ScriptScope scope) { //достаем функцию для интегрирования dynamic monte_carlo = scope.GetVariable("monte_carlo"); //достаем необходимые переменные dynamic fun = scope.GetVariable("fun"); dynamic N = scope.GetVariable("N"); dynamic result; System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); result = monte_carlo(fun, data.start, data.stop, N); sWatch.Stop(); Console.WriteLine("Поток № {0}: Паралл. алгоритм = {1} мс,. Результат: {2}", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString(), result); resp.Post(1); }
static void Main(string[] args) { int i; nc = 4; n = 10000000; a = new long[n]; b = new long[n]; ResultArr = new long[n]; long ResultA = 1; long Res = 0; long ResultB = 1; Random r = new Random(); for (int j = 0; j < n; j++) { a[j] = r.Next(1, 3); b[j] = r.Next(1, 3); } System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (i = 0; i < n; i++) { ResultA = ResultA * a[i]; ResultB = ResultB * b[i]; ResultArr[i] = ResultA + ResultB; Res = Res + ResultArr[i]; } Console.WriteLine(ResultB); sWatch.Stop(); Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (i = 0; i < nc; i++) ClArr[i] = new InputData(); // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; ClArr[i].i = i; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port<int> p = new Port<int>(); for (i = 0; i < nc; i++) Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], p, Mul)); Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { })); }
static void Main(string[] args) { int outer, i = 0; nc = 4; n = 10000001; float sum = 0; a = new int[n]; b = new int[nc]; Random r = new Random(); for (int j = 0; j < n; j++) { a[j] = r.Next(100); } System.Diagnostics.Stopwatch sWatch = new System.Diagnostics.Stopwatch(); sWatch.Start(); for (outer = 0; outer < n; outer++) { sum += a[outer]; } sWatch.Stop(); Console.WriteLine("Последовательный алгоритм = {0} мс.", sWatch.ElapsedMilliseconds.ToString()); Console.WriteLine("Среднее в последовательном={0}", Math.Round((sum / n), 0) + " "); // создание массива объектов для хранения параметров InputData[] ClArr = new InputData[nc]; for (i = 0; i < nc; i++) { ClArr[i] = new InputData(); } // делим количество элементов в массиве на nc частей int step = (Int32)(n / nc); // заполняем массив параметров int c = -1; for (i = 0; i < nc; i++) { ClArr[i].start = c + 1; ClArr[i].stop = c + step; ClArr[i].i = i; c = c + step; } Dispatcher d = new Dispatcher(nc, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); Port <int> p = new Port <int>(); for (i = 0; i < nc; i++) { Arbiter.Activate(dq, new Task <InputData, Port <int> >(ClArr[i], p, Mul)); } Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, p, nc, delegate(int[] array) { })); }