Пример #1
0
        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());
        }
Пример #2
0
            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)
     {   }));

        }
Пример #3
0
        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());

        }
Пример #4
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-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());
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
            }));
        }
Пример #7
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)
     {   }));

        }
Пример #8
0
        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);
        }
Пример #9
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)
     {   }));}}}
Пример #10
0
 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());
 }
Пример #11
0
        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);
            }));
        }
Пример #12
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());
 }
Пример #13
0
        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());

        }
Пример #14
0
        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);
        }
Пример #15
0
        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);
     }));

        }
Пример #16
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);
        }
Пример #17
0
            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)
     {   }));

        }
Пример #18
0
        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)
                                                             {   }));
        }