![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| 56illusion |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 12.5.2010 Репутация: нет Всего: нет |
Всем привет.
Я тут ночью заседелся и решил вникнуть в паралельное программирование, так как оно значительно сокращает время и увеличивает скорость программы. А так же Я решил провести маленький эксперимент и проверить на сколько сокращаеться время действия программы. написал я не сложный алгоритм для отображение всех вариантов слов состоящих из 4 букав. Код без паралелизма -----------------------------------
и тот же смысл только с паралелизмом ---------------------------------------------------
При компиляций каждой из программ я наблюдал за состояние процессора. В случаи паралелизма процессор работал на максимум но вот время исполнение в двое больше!!!!!!!!!!! Но я вить ожидал что время в 2 раза будет ниже... как такое возможно??? кстате в программе с паралелизмом отображаються и слова с большим количеством букв чем 4...и ето тоже невозможно, вить массив у меня только на 4.. Вобщем я запутолся. ----------------------------------------------- Если комуто интересна эта тема помогите разобраться в чём дело... может быть я не правельно написал код с параллелизмом??? |
||||
|
|||||
| 6atoh |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 15.9.2006 Где: Minsk Репутация: 2 Всего: 4 |
Взглянув на ваш код с параллелизацией, могу сказать следующее:
1. Параллелизация внутри параллелизации - это очень плохо. В вашем алгоритме можно наблюдать 4(!) вложенных цикла с параллелизацией. Перепишите алгоритм так, чтобы он использовал лишь один цикл, либо цепочку циклов. 2. При параллелизации необходимо заботиться о синхронизации данных между потоками. В данном случае локальный массив pass, содержимое которого выводится на консоль, не защищен никоим образом от одновременного доступа к нему разных потоков. Соответственно, от алгоритма не стоит ожидать корректной работы. Учтите, что без использования параллелизации ваш код выполняется последовательно (1 путь исполнения). При использовании параллелизации он выполняется параллельно (2 пути исполнения, нужна синхронизация), а наличие вложенных циклов многократно увеличивает кол-во возможных путей исполнения и работу алгоритма предсказать сложно. Вывод: ваш алгоритм не подходит для применения параллелизации. |
|||
|
||||
| 6atoh |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 15.9.2006 Где: Minsk Репутация: 2 Всего: 4 |
Здесь очень хорошо написано про использование класса Parallel, в том числе и метода For.
Таким образом, я бы сделал следующее с вашим алгоритмом: 1. Заменил все вложенные Parallel.For на обычные for-выражения. 2. Сделал бы вывод на консоль массива одной операцией WriteLine, а не последовательностью вызовов Write.
Это сообщение отредактировал(а) 6atoh - 7.9.2010, 13:04 |
||||
|
|||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 5 Всего: 40 |
это зависит от кучи параметров, но конкретно на 2 ядрах, при самых лучших условиях, в 2 раза быть не может, ибо тратиться время на создание потоков и их синхронизацию, и на 2 ядрах средний прирост составляет 1,6 в этом суть, у вас ресурсы затраченные на создание потоков превышаю, полезный коэффициент. Если бы распараллелили, например, поворот картинок в папке, то разницу увидели.
убиться.... Parallel.For сам решает сколько потоков для какой задачи создать, и как их распределить по ядрам, а вы принуждаете его создавать и создавать их. в любом случае посмотрите, для начала, более классические подходы к потокам, например backgroundWorker |
|||
|
||||
| 56illusion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 12.5.2010 Репутация: нет Всего: нет |
6atoh Большое спасибо вам. Вы мне очень помогли и прекрасно пояснили в чём заключалась моя ошибка.
По интернету встретил множество информаций про параллелизм но не увидел не одной статьй про то как правельно применять его. Скажите а в процессе самого параллелизма как возможно то что код сам увеличивает длину массива??? на консоле были видны слова и по 8 букв.. Возможно ли что два слова отображались паралельно и одновременно??? gambit раскажите мне пожалуйсто про backgroundWorker в гугле искать? Спасибо всем |
|||
|
||||
| CYBERDREAM |
|
|||
![]() I think, there4 I am ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1096 Регистрация: 31.10.2006 Где: CyberLand Репутация: 11 Всего: 28 |
-------------------- Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно) Telegram, skype: kuchuk.artiom |
|||
|
||||
| 56illusion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 12.5.2010 Репутация: нет Всего: нет |
Я скомпилировал код который показал мне 6atoh. время программы 4.7 минуты. А время программы без параллелизма 2.7 минуты. Почему же время только возрастает???
|
|||
|
||||
| 6atoh |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 15.9.2006 Где: Minsk Репутация: 2 Всего: 4 |
Это происходит потому, что у вас используется Console.Write. В данном случае output консоли - это общий ресурс, запись в который необходимо как-то упорядочить, чтобы строки выводились по 4 символа. Я предложил это сделать, заменив Console.Write(pass[i]) на Console.WriteLine(pass);
Во-первых для таких измерений я бы рекомендовал использовать Stopwatch, вместо DateTime.Now. Это на будущее. Во-вторых, как уже сказал gambit, в данном случае затраты на создание потоков и их синхронизацию могут превышать затраты на выполнение самого алгоритма. На моей машине (Core2 Duo E8400 3.0GHz, 4Gb RAM) результаты следующие: без параллелизации: 41 сек, загрузка ЦП ~ 45% с параллелизацией: 45 сек, загрузка ЦП 100% Чтобы ощутить выигрыш в параллелизации, необходимо использовать алгоритм, который, к примеру осуществляет сложные математические вычисления, а не выводит символы на консоль. |
|||
|
||||
| 56illusion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 12.5.2010 Репутация: нет Всего: нет |
6atoh Спасибо вам. теперь Я всё ясно понял.
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |