Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/75: Рейтинг темы: голосов - 75, средняя оценка - 4.71
4 / 1 / 0
Регистрация: 13.01.2009
Сообщений: 26

Распараллеливание процессов

03.12.2010, 14:07. Показов 15529. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Было дано задание посчитать сумму вещественных чисел в какой-то последовательности.
Только сделать это надо распараллелив выполнение программы.
Может кто-нить привести пример элементарнейшего распаралеливания, что бы наглядно разобраться как оно работает?

П.с. Поиск по инету не очень помог, никак не получается запустить примеры которые там приводятся... вечные ошибки и не могу понять чего не нравится

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2010, 14:07
Ответы с готовыми решениями:

Распараллеливание циклических процессов равномерно по ядрам процессора
здравствуйте! подскажите, пожалуйста, если кто-нибудь знает, как распараллелить программу. Например, у меня на компьютере 4 процессора, как...

Распараллеливание
Уважаемые формумчане! Подскажите, кто-нибудь, пожалуйста, в чем тут может быть ошибка? using System; using...

Распараллеливание цикла while
Здравствуйте, дорогие форумчани! Мучаюсь над проблемой распараллеливания while:gsad: Пишу bbs генератор, а он, как известно, очень...

6
 Аватар для Бельфегор
688 / 602 / 139
Регистрация: 08.05.2009
Сообщений: 1,098
03.12.2010, 15:18
то есть на разных node-ах сделать?? MPI нужен?
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
03.12.2010, 19:29
Вот набросал некоторые примеры.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#region using
 
using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
 
#endregion
 
namespace ConsoleApplicationTest
{
    public static class Program
    {
        private static void Main()
        {
            for (var num = 0; num < 6; num++)
            {
                // Получаем диапазон от 0 до 1000
                var source = Enumerable.Range(0, 500000).ToArray();
                // Запускаем таймер
                var stopwatch = Stopwatch.StartNew();
                // Вычисляем сумму не параллельно.
                var sum = source
                    // Вычислем для каждого числа квадрат его косинуса
                    .Select(i => Math.Pow(Math.Cos((double) i/100), 2))
                    // Суммируем полученные значения
                    .Sum();
                // Останавливаем таймер
                stopwatch.Stop();
 
                Console.WriteLine(sum);
                Console.WriteLine("не параллельно  " + stopwatch.Elapsed);
 
                // Перезапускаем таймер
                stopwatch.Restart();
                // Вычисляем сумму параллельно с помощью PLinq
                sum = source
                    // Переключаемся на PLinq
                    .AsParallel()
                    .Select(i => Math.Pow(Math.Cos((double) i/100), 2))
                    .Sum();
                stopwatch.Stop();
 
                // Выводим результат и затраченное время.
                Console.WriteLine(sum);
                Console.WriteLine("параллельно1    " + stopwatch.Elapsed);
 
                sum = 0;
                // Объект для управления блокировкой.
                var lockObj = new object();
 
                stopwatch.Restart();
                // Вычисляем сумму параллельно с помощью Parallel.For
                Parallel.For(0, source.Length, i =>
                                                   {
                                                       // Вычисляем текущее значение
                                                       var x = Math.Pow(Math.Cos((double) source[i]/100), 2);
                                                       // Блокируем доступ к sum из других потоков
                                                       // Если убрать блокировку, то в sum может получится неверное значение.
                                                       lock (lockObj)
                                                       {
                                                           // Прибавляем значение к sum
                                                           sum += x;
                                                       }
                                                   });
                stopwatch.Stop();
 
                Console.WriteLine(sum);
                Console.WriteLine("параллельно2    " + stopwatch.Elapsed);
 
                sum = 0;
                // Разбиваем исходный массив на несколько частей, в зависимости от количества ядер
                var rangePartitioner = Partitioner.Create(0, source.Length);
 
                stopwatch.Restart();
                // Вычисляем сумму параллельно с помощью  Parallel.ForEach
                // Как можно заметить, наиболее производительный способ в данном случае.
                // В каждом потоке выполняется свой цикл по части массива, 
                // что обеспечивает большую производительность при несложных вычислениях на каждой итерации.
                Parallel.ForEach(rangePartitioner,
                                 // range - начальный и конечный индексы части массива, которую необходимо обработать в данном потоке.
                                 // loopState - состояние потока.
                                 (range, loopState) =>
                                     {
                                         // Вычисляем сумму для части массива.
                                         var x = 0d;
                                         for (var i = range.Item1; i < range.Item2; i++)
                                             x += Math.Pow(Math.Cos((double) source[i]/100), 2);
                                         // Прибавляем её к общей сумме.
                                         lock (lockObj)
                                         {
                                             sum += x;
                                         }
                                     });
                stopwatch.Stop();
 
                Console.WriteLine(sum);
                Console.WriteLine("параллельно3    " + stopwatch.Elapsed);
 
                sum = 0;
                stopwatch.Restart();
                // Вычисляем сумму параллельно с помощью  Parallel.For
                // Принцип аналогичен предыдущему примеру.
 
                Parallel.For(
                    // Начальный и конечный индексы цикла
                    0, source.Length, // Начальный и конечный индексы цикла
                    // Начальное значение внутренней переменной, локальной для каждого цикла.
                    () => 0d,
                    // Функция, выполняющаяся при каждой итерации.
                    // i - текущий индекс.
                    // loopState - состояние потока.
                    // subtotal - локальная переменная потока.
                    // Прибавляем к локальной переменной её предыдущее значение + Math.Pow(Math.Cos..
                    (i, loopState, subtotal) => subtotal + Math.Pow(Math.Cos((double) source[i]/100), 2),
                    // Действие, вызываемое когда поток заканчивается.
                    subtotal =>
                        {
                            // Прибавляем итоговое значение локальной переменной к общей сумме.
                            lock (lockObj)
                            {
                                sum += subtotal;
                            }
                        }
                    );
                stopwatch.Stop();
 
                Console.WriteLine(sum);
                Console.WriteLine("параллельно4    " + stopwatch.Elapsed);
                Console.WriteLine("----------------------");
            }
 
            Console.ReadKey();
        }
    }
}
Ссылки:
Параллельное программирование в .NET Framework.
Оператор lock (Справочник по C#).
2
4 / 1 / 0
Регистрация: 13.01.2009
Сообщений: 26
09.12.2010, 12:14  [ТС]
Error 1 The type or namespace name 'Concurrent' does not exist in the namespace 'System.Collections' (are you missing an assembly reference?)

Error 2 The type or namespace name 'Tasks' does not exist in the namespace 'System.Threading' (are you missing an assembly reference?)

М...?
0
Заблокирован
09.12.2010, 12:32
Шанти, вот подсчет десяти чисел Фибоначи в разных потоках
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Threading;
 
public class Fibonacci
{
    private int _n;
    private int _fibOfN;
    private ManualResetEvent _doneEvent;
 
    public int N { get { return _n; } }
    public int FibOfN { get { return _fibOfN; } }
 
    // Constructor.
    public Fibonacci(int n, ManualResetEvent doneEvent)
    {
        _n = n;
        _doneEvent = doneEvent;
    }
 
    // Wrapper method for use with thread pool.
    public void ThreadPoolCallback(Object threadContext)
    {
        int threadIndex = (int)threadContext;
        Console.WriteLine("thread {0} started...", threadIndex);
        _fibOfN = Calculate(_n);
        Console.WriteLine("thread {0} result calculated...", threadIndex);
        _doneEvent.Set();
    }
 
    // Recursive method that calculates the Nth Fibonacci number.
    public int Calculate(int n)
    {
        if (n <= 1)
        {
            return n;
        }
 
        return Calculate(n - 1) + Calculate(n - 2);
    }
}
 
public class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 10;
 
        // One event is used for each Fibonacci object.
        ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
        Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
        Random r = new Random();
 
        // Configure and start threads using ThreadPool.
        Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
        }
 
        // Wait for all threads in pool to calculate.
        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("All calculations are complete.");
 
        // Display the results.
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            Fibonacci f = fibArray[i];
            Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN);
        }
        Console.ReadLine();
    }
}
где нашел в инете, не помню
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
09.12.2010, 19:17
Цитата Сообщение от Шанти Посмотреть сообщение
Error 1 The type or namespace name 'Concurrent' does not exist in the namespace 'System.Collections' (are you missing an assembly reference?)

Error 2 The type or namespace name 'Tasks' does not exist in the namespace 'System.Threading' (are you missing an assembly reference?)

М...?
Работает только под .NET 4.0. То есть VS 2010. Там добавилось очень много средств, сильно упрощающих распараллеливание приложений.

Вообще, про параллельность смотри тут:
Многопоточность... как ? с чего начать?
0
4 / 1 / 0
Регистрация: 13.01.2009
Сообщений: 26
09.12.2010, 19:58  [ТС]
Ага, я уже поняла, что студия более новая нужна. Спасибо, попробую что-нить путное написать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2010, 19:58
Помогаю со студенческими работами здесь

Распараллеливание метода
Пытаюсь распаралелить добавление эдементов в ListView, так как обработка больших файлов занимает довольно много времени. Но поскольку в С#...

Распараллеливание цикла
for (int i = 0; i &lt; 30; i++) { db.cdb.RefreshConnection(); res...

Распараллеливание вычислений
Здравствуйте! Есть симулятор клеточного автомата. &quot;Поле действий&quot; - двухмерный массив класса Cell. Эти клетки имеют кучу параметров, а...

Распараллеливание foreach
Доброго времени суток! Возник такой вопрос: хочу распараллелить foreach: foreach (var group in partition) ...

Распараллеливание. Потоки.
Есть функция: private void ExecuteProgram(string filename) { blablabla } Есть событие, по которому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru