Комментарии 9
Интересно, а почему вы в секции Reduce(accumulate) решили использовать в примерах std::for_each и функтор, а не std::accumulate?
+2
Вопрос по комментарию в коде "// Выполняем объединение".
Разве thread.join() это объединение? ИМХО это просто мы ждем завершения выполнения треда.
Разве thread.join() это объединение? ИМХО это просто мы ждем завершения выполнения треда.
0
Окей.
Ну и вместо
тогда уж лучше написать:
Если уж быть педантичным :)
Ну и вместо
std::thread::hardware_concurrency()
тогда уж лучше написать:
QThread::idealThreadCount()
Если уж быть педантичным :)
0
Занятно, но следует уточнить несколько деталей.
- у вас логическая ошибка в расчете разбиения задачи на подзадачи.
- Предположение основанное на том что, кол-во элементов массива всегда кратно кол-ву ядер верно не всегда.
(например кол-во задач 10, кол-во ядер 8) - также уместно будет расчитывать на то, что кол-во задач может быть меньше кол-ва ядер.
(например кол-во задач 7, кол-во ядер 8)
- Предположение основанное на том что, кол-во элементов массива всегда кратно кол-ву ядер верно не всегда.
- Таже ошибка в цикле поиска максимума (последний элемент не учитывается) :(
Условие item < task.last; не захватывает последний элемент в последнем треде. - Использование не иницилизированной ссылки в структуре не желательно. Хотя компилятор и делает все за нас, но даже банальный resize() не компилируется (и не должен).
Лучше использовать старый добрый указатель. - Если уж взялись писать auto то пишите его везде где возможно и decltype тоже в помощь.
0
- Да. В случае не кратного разбиения допустил ошибку округления. Я не делал предположения, а просто взял не нулевое число. Т.к. в Qt Concurrent map использует пул потоков, то можно варьировать гранулярностью задачи и размером пула.
- Полуоткрытый интервал. Путь taskSize = 7, тогда получаем [0, 7); [7, 14); [14, 21)… Возможно где-то ошибся на единицу.
- Я всегда использую ссылки везде, где это возможно. Невозможно создать не инициализированную ссылку, в отличие от указателя. Проку от resize/assign тут особого нет. Вектор заполняется один раз, при том, что тут создаются и синхронизируются потоки.
- Что мне это дает?
0
3 Не инициализированную ссылку создать нельзя, но чтобы она ссылалась в никуда можно.
int* ab = nullptr;
int& b = *ab;
Хотя в таком примере это не столь важно, но я предпочитаю всегда писать с целью повторного использования.
4 Согласованность кода.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
MapReduce в Qt Concurrent