Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2016, 19:29
Delphinaut Delphinaut вне форума
Прохожий
 
Регистрация: 28.01.2016
Сообщения: 11
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию Бинарные деревья и многопоточность

Имеется алгоритм, который строит бинарное дерево. Требуется распараллелить алгоритм построения. Самый очевидный вариант - строить левое и правое поддеревья в двух разных потоках. Потом объединить поддеревья после того, как оба потока завершат работу (WaitForMultipleObjects).

Но можно же строить и в четыре потока: левое (1) и правое (2) поддеревья левого поддерева, левое (3) и правое (4) поддеревья правого поддерева. И т.д.

Задача. Определить оптимальное кол-во потоков, при котором бинарное дерево строится за наименьшее кол-во времени на 2-х, 4-х и 8-ми ядерных процессорах. Написать рекурсивный алгоритм создания потоков.

Т.е. первоначально имеется один поток (главный), которой создаёт два дочерних потока для построения левого и правого поддеревьев. Затем дочерние потоки поступают точно так же и т.д.

Последний раз редактировалось Delphinaut, 31.01.2016 в 19:44.
Ответить с цитированием
  #2  
Старый 31.01.2016, 19:53
Delphinaut Delphinaut вне форума
Прохожий
 
Регистрация: 28.01.2016
Сообщения: 11
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Сам алгоритм вроде бы простой. Но можно насоздавать лишних потоков, которые только замедлят построение из-за сохранения/загрузки контекста потока, если два или несколько потоков программы будут выполняться в одном физическом потоке процессора. Вопрос: когда остановиться? Сколько потоков реально будут выполняться параллельно на современных процессорах?

Последний раз редактировалось Delphinaut, 01.02.2016 в 12:44.
Ответить с цитированием
  #3  
Старый 06.02.2016, 22:23
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Допустим, у вас 8 ядер. Тогда сколько потоков не создавай, параллельно больше 8 не будет работать. А вот запустить на графическом процессоре (допустим, библиотека CUDA) можно намного больше параллельных потоков. Правда, т.к. центральный процессор быстрее, то выигрыш ощущается только на больших объёмах данных (при этом, естественно, теряется время на перекачку данных CPU <-> GPU)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter