Название: "Разпоточить" рекурсию Отправлено: Igors от Май 02, 2014, 07:36 Добрый день
Навеяно этим http://www.prog.org.ru/topic_26946_0.html (http://www.prog.org.ru/topic_26946_0.html), но там мои попытки завязать содержательный разговор не имели успеха :) Типа "ну вот есть средства (Concurrent, QThread) - вот ими и пользуйся". Наверное подразумевается что если уж выучил средства по букварю, то все самой получится. Но вот чего-то у меня не выходит :) Псевдокод задачи Код Как же будем "разпоточивать"? Да, и давайте по-взрослому: число созданных потоков не должно превышать число ядер Спасибо Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 02, 2014, 08:02 В простом случае, нет нужды распоточивать рекурсию.
Например, можно запустить две нитки, каждой дать по половине массива. Дождаться их завершения и объединить их в запускающей нитке. Или запустить четыре и дать каждой по четверти массива. Название: Re: "Разпоточить" рекурсию Отправлено: Igors от Май 02, 2014, 08:43 В простом случае, нет нужды распоточивать рекурсию. Ну четыре надо сначала получить. А две - это всего 2 ядра, а сейчас 8 - пройденный этап, да и 16 никого не удивить. Да и даже 2 - как запускать-то? (в смысле куда встроить код запуска).Например, можно запустить две нитки, каждой дать по половине массива. Дождаться их завершения и объединить их в запускающей нитке. Или запустить четыре и дать каждой по четверти массива. По поводу смысла: начиная так метров со 100 данных - он появляется очень быстро Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 02, 2014, 08:52 В запускающей ните создаются два потока, в качестве функции выполнения используется MergeSort со своей половиной массива. После этого запускающая нить останавливается и ждёт завершение рабочих ниток, а потом делает merge результирующий массивов.
Раскидать это можно и на 8 ядер. Например, в запускаемый создаём две нитки, внутри себя они создают ещё две рабочих. Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 02, 2014, 09:52 Добрался до компьютера:
Код
Название: Re: "Разпоточить" рекурсию Отправлено: Igors от Май 02, 2014, 10:11 Да, красиво с bind. Но все-таки это hard-coded для 2 ниток. Да, можно для 4, но все равно решение остается hard-coded. И предлагаю не частить, а послушать что люди скажут. Поэтому беру паузу :)
Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 02, 2014, 10:40 Такое легко можно сделать для любого количества ниток. Главное требование, что это количество делилось на 2, но для этого алгоритма это вполне адекватное требование.
Реальных ниток будет больше, на каждую пару +1 Название: Re: "Разпоточить" рекурсию Отправлено: m_ax от Май 02, 2014, 12:09 Цитировать Как же будем "разпоточивать"? Да, и давайте по-взрослому: число созданных потоков не должно превышать число ядер Спасибо Эта задача аналогична распараллеливанию transform из этой темы http://www.prog.org.ru/topic_25963_15.html (http://www.prog.org.ru/topic_25963_15.html) Где вместо std::transform нужно поставить MergeSort) Название: Re: "Разпоточить" рекурсию Отправлено: Igors от Май 03, 2014, 05:57 Эта задача аналогична распараллеливанию transform из этой темы http://www.prog.org.ru/topic_25963_15.html (http://www.prog.org.ru/topic_25963_15.html) В том-то и дело что нет, в данном случае число задач неизвестно заранее.Где вместо std::transform нужно поставить MergeSort) Такое легко можно сделать .. Вам это ничего (никого) не напоминает? :) "Прошу исполнить"Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 03, 2014, 07:36 Вам это ничего (никого) не напоминает? :) А вы про что/кого?"Прошу исполнить" Не вопрос.Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 03, 2014, 08:11 Ловите:
Код
numthread - это необходимое количество квадратов пар потоков. Можно сделать красивей, но мне пока лень. :) Название: Re: "Разпоточить" рекурсию Отправлено: m_ax от Май 03, 2014, 14:51 Цитировать В том-то и дело что нет, в данном случае число задач неизвестно заранее. Ааа.. понятненько) Ну так old уже предложил вариант) Думаю, что ещё можно эту рекурсию в компил тайме раскрутить.. (через мета шаблонную магию) Название: Re: "Разпоточить" рекурсию Отправлено: Igors от Май 04, 2014, 06:27 Ловите: Это (может быть) помогло бы девушке сдать лабу, но не более того. Формально да, все нитки запущены, но ведь они толкаются и ждут друг друга. Производительность/КПД такой реализации ужасна.Да, и UI кто-то всегда должен сопли подтирать, нечего там всем рассиживаться на join. Название: Re: "Разпоточить" рекурсию Отправлено: Old от Май 04, 2014, 07:27 Что за глупости? Никто там не толкается. Опять вас понесло в голословные утверждения про производительность и КПД? :)
Всю основную работу делает заданное количество ниток рекурсивно. Дополнительные нити ждут их и процессор не едят. Если начнете думать, то и с UI все будет в порядке. Это реализация сделанная на коленке за несколько минут, можно избавиться от объединяющих ниток, но нужно писать дополнительный код. Мне лень, да и не даст это особого прироста. Так что очень ждем от вас "профессиональную" реализацию и будем сравнивать. :) |