Pull to refresh

Comments 9

Интересно, а почему вы в секции Reduce(accumulate) решили использовать в примерах std::for_each и функтор, а не std::accumulate?

Проглядел std::accumulate.

Вопрос по комментарию в коде "// Выполняем объединение".

Разве thread.join() это объединение? ИМХО это просто мы ждем завершения выполнения треда.

Тут я имел ввиду последующий два цикла. Первый цикл ждет завершение потоков, второй цикл делает свертку.

Окей.

Ну и вместо

std::thread::hardware_concurrency()


тогда уж лучше написать:

QThread::idealThreadCount()


Если уж быть педантичным :)
Ну и std::thread::hardware_concurrency() бывает возвращает 0…

Занятно, но следует уточнить несколько деталей.


  1. у вас логическая ошибка в расчете разбиения задачи на подзадачи.
    • Предположение основанное на том что, кол-во элементов массива всегда кратно кол-ву ядер верно не всегда.
      (например кол-во задач 10, кол-во ядер 8)
    • также уместно будет расчитывать на то, что кол-во задач может быть меньше кол-ва ядер.
      (например кол-во задач 7, кол-во ядер 8)
  2. Таже ошибка в цикле поиска максимума (последний элемент не учитывается) :(
    Условие item < task.last; не захватывает последний элемент в последнем треде.
  3. Использование не иницилизированной ссылки в структуре не желательно. Хотя компилятор и делает все за нас, но даже банальный resize() не компилируется (и не должен).
    Лучше использовать старый добрый указатель.
  4. Если уж взялись писать auto то пишите его везде где возможно и decltype тоже в помощь.
  1. Да. В случае не кратного разбиения допустил ошибку округления. Я не делал предположения, а просто взял не нулевое число. Т.к. в Qt Concurrent map использует пул потоков, то можно варьировать гранулярностью задачи и размером пула.
  2. Полуоткрытый интервал. Путь taskSize = 7, тогда получаем [0, 7); [7, 14); [14, 21)… Возможно где-то ошибся на единицу.
  3. Я всегда использую ссылки везде, где это возможно. Невозможно создать не инициализированную ссылку, в отличие от указателя. Проку от resize/assign тут особого нет. Вектор заполняется один раз, при том, что тут создаются и синхронизируются потоки.
  4. Что мне это дает?

3 Не инициализированную ссылку создать нельзя, но чтобы она ссылалась в никуда можно.


    int* ab = nullptr;
    int& b = *ab;

Хотя в таком примере это не столь важно, но я предпочитаю всегда писать с целью повторного использования.
4 Согласованность кода.

Sign up to leave a comment.

Articles