Заблокирован

Распараллеливание нахождения интеграла методом трапеций

24.02.2016, 23:13. Показов 3410. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
сделал через PLINQ и через потоки, но через потоки уже час висит и никак, я думал вначале что реально просто так долго, но щас уже начал сомневаться, посмотрите пожалуйста, вроде все правильно, но почему же так долго...
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
 
namespace lab1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write("start end step: ");
                var values = Console.ReadLine().Split(' ').Select(double.Parse).ToArray();
                var start = values[0];
                var end = values[1];
                var step = values[2];
                Func<double, double> function = x => Math.Exp(-x);
 
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                var result = TheMethodOfTrapezoidsSequential(function, start, end, step);
                stopwatch.Stop();
                Console.WriteLine($"[sequential] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
 
                stopwatch.Restart();
                var steps = TheMethodOfTrapezoidsSteps(function, start, end, step);
                var stepsParallel = steps.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                    .WithDegreeOfParallelism(Environment.ProcessorCount);
                result = stepsParallel.Sum();
                stopwatch.Stop();
                Console.WriteLine($"[PLINQ parallel] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
 
                stopwatch.Restart();
                result = TheMethodOfTrapezoidsParallel(function, start, end, step);
                stopwatch.Stop();
                Console.WriteLine($"[multi-threading parallel] result: {result}; time: {stopwatch.ElapsedMilliseconds}");
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
            }
            Console.ReadKey();
        }
 
        public static double TheMethodOfTrapezoids(Func<double, double> function, double x, double step)
        {
            return (function(x) + function(x + step)) * step / 2;
        }
 
        public static double TheMethodOfTrapezoidsSequential(Func<double, double> function, double start, double end, double step)
        {
            var result = 0.0;
 
            for (double x = start; x <= end; x += step)
                result += TheMethodOfTrapezoids(function, x, step);
 
            return result;
        }
 
        public static IEnumerable<double> TheMethodOfTrapezoidsSteps(Func<double, double> function, double start, double end, double step)
        {
            for (double x = start; x <= end; x += step)
                yield return TheMethodOfTrapezoids(function, x, step);
        }
 
        public static double TheMethodOfTrapezoidsParallel(Func<double, double> function, double start, double end, double step)
        {
            var count = 0;
            var steps = new List<double>();
            ParameterizedThreadStart threadHandler = obj =>
            {
                var x = (double)obj;
                var r = TheMethodOfTrapezoids(function, x, step);
                steps.Add(r);
            };
 
            for (double x = start; x <= end; x += step, count++)
                new Thread(threadHandler).Start(x);
 
            while (steps.Count != count) ;
 
            return steps.Sum();
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2016, 23:13
Ответы с готовыми решениями:

Решение интеграла методом трапеций
Необходимо решить интеграл используя метод трапеций Добавлено через 24 минуты \int(sqrt(4-x^2)) (2,0) Добавлено через 7 минут ...

Вычисление определенного интеграла методом криволинейных трапеций
Помогите пожалуйста написать программу вычисления определенного интеграла методом криволинейных трапеций интеграл : ...

Вычисление определенного интеграла методом криволинейных трапеций
Подскажите пожалуйста, написать консольную программу на C# для вычисления определенного интеграла методом криволинейных трапеций, интеграл...

8
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
25.02.2016, 00:01
Penelent, А не пробовали через отладку проверять, на какой именно строке висит? Например, на 85 строку поставить брекпоинт.
Сейчас проверил. 85 строка ( while (steps.Count != count) Не нужна, на ней происходит зацикливание, скорее всего из-за погрешности округления double. Без этой строчке у меня всё сработало.
0
Эксперт .NET
 Аватар для Rius
12321 / 7312 / 1618
Регистрация: 25.05.2015
Сообщений: 22,090
Записей в блоге: 14
25.02.2016, 06:25
Лучший ответ Сообщение было отмечено Penelent как решение

Решение

Если это
Цитата Сообщение от ORLENOK Посмотреть сообщение
while (steps.Count != count)
для ожидания завершения всех потоков, то оно делается не так.

Добавлено через 16 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public static double TheMethodOfTrapezoidsParallel(Func<double, double> function, double start, double end, double step)
        {
            var count = 0;
            var steps = new List<double>();
 
            List<Task> tasks = new List<Task>();
 
            for (double x = start; x <= end; x += step, count++)
            {
                tasks.Add(Task.Run(() =>
                    {
                        var r = TheMethodOfTrapezoids(function, x, step);
                        lock (steps)
                        {
                            steps.Add(r);
                        }
                    }));
            }
 
            Task.WaitAll(tasks.ToArray());
 
            return steps.Sum();
        }
Без lock (steps) видно, что задач выполнено больше, чем в этих задачах добавлено значений в список (получается steps.Count != count). Очевидно нарушение многопоточного доступа к списку.
Можете попробовать ConcurrentBag<T> вместо List<T>.

Добавлено через 5 минут
Цитата Сообщение от ORLENOK Посмотреть сообщение
скорее всего из-за погрешности округления double
count типа int. Никаких погрешностей.
Числа с плавающей точкой нельзя напрямую сравнивать не из-за погрешностей округления, а из-за природы их представления в памяти. Для сравнения надо брать разницу:
C#
1
2
3
double a, b;
double epsilon = 0.0001; // или Double.Epsilon, если устраивает
if (Math.Abs(a - b) < epsilon) { }
1
Заблокирован
25.02.2016, 07:37  [ТС]
ORLENOK, естественно пробовал, нет, там у меня ничего не зависало, у меня было видно как бесконечно создаются эти потоки и выполняются, в первом цикле...

Rius, да да, именно для ожидания завершения всех потоков, сейчас с вашим кодом и правда заработало, но ведь это уже не потоки? или я ошибаюсь? просто в задании четко сказано использовать потоки, а тут задачи... или это одно и то же?

з.ы. кстати так и так все равно самый быстрый выходит последовательный метод
Миниатюры
Распараллеливание нахождения интеграла методом трапеций  
0
Эксперт .NET
 Аватар для Rius
12321 / 7312 / 1618
Регистрация: 25.05.2015
Сообщений: 22,090
Записей в блоге: 14
25.02.2016, 07:47
Это те же потоки, только более современные и удобные. Почитайте про TPL.
Параллельный быстрее к месту. Если на переключение контекста тратится больше времени, чем выигрывается от распараллеливания полезной работы, то смысла в применении потоков нет.

Добавлено через 7 минут
Да, Task берет поток из пула потоков, в отличие от Thread.
1
Заблокирован
25.02.2016, 07:52  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Да, Task берет поток из пула потоков, в отличие от Thread.
что это значит?

в конечном счете даже еще проще сделал
C#
1
2
3
4
5
6
7
8
9
10
static double TheMethodOfTrapezoidsParallel(Func<double, double> function, double start, double end, double step)
{
    var tasks = new ConcurrentBag<Task<double>>();
 
    for (var x = start; x <= end; x += step)
        tasks.Add(Task.Run(() => TheMethodOfTrapezoids(function, x, step)));
 
    Task.WaitAll(tasks.ToArray());
    return tasks.Select(t => t.Result).Sum();
}
0
Эксперт .NET
 Аватар для Rius
12321 / 7312 / 1618
Регистрация: 25.05.2015
Сообщений: 22,090
Записей в блоге: 14
25.02.2016, 07:55
То, что Thread можно запустить кучу. А Task запустится столько, сколько считает нужным среда. Task не создаёт себе новый поток, а оптимально использует доступное.
Между Thread и потоком есть однозначное соответствие. А между Task и потоком - нет.
0
Заблокирован
25.02.2016, 07:57  [ТС]
Rius, ну вот вы меня в конец запутали выходит Task != Thread все таки? значит это не по заданию выходит?
0
Эксперт .NET
 Аватар для Rius
12321 / 7312 / 1618
Регистрация: 25.05.2015
Сообщений: 22,090
Записей в блоге: 14
25.02.2016, 08:47
Не однозначно равно.
ConcurrentBag попробуйте в своём первом варианте.

Добавлено через 42 минуты
Если задание именно забить планировщик потоками, то Thread. Если ручной запуск потоков, то и Task пойдёт.
Никто не мешает сдать больше вариантов, чем задано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2016, 08:47
Помогаю со студенческими работами здесь

Нахождения определенного интеграла методом трапеций
2. Используя процедурный тип данных реализовать функцию нахождения определенного интеграла любой заданной функции на заданном отрезке...

Разработать программу для вычисления интеграла методом трапеций и методом Симпсона
Разработать программу для вычисления интеграла методом трапеций и методом Симпсона, оформив каждый способ в виде отдельной функции. Вывести...

Разработать программу нахождения интеграла, формула трапеций
Разработать программу нахождения интеграла с помощью указанной квадратурной формулы. Результат вывести на экран. ...

Нахождение определенного интеграла методом прямоугольников и методом трапеций
Написать программу, которая находит определенный интеграл \int_{a}^{b}f(x)dx методом прямоугольников и методом трапеций. Исходные данные...

Вычисление интеграла методом прямоугольников и методом трапеций
Добрый вечер, уважаемые форумчани! Прошу вас, подсказать мне по какой формуле вычисляется истинное значение интеграла? Свою работу в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru