Многопоточность не использует преимущества нескольких ядер? - PullRequest
1 голос
/ 07 июля 2010

Мой компьютер двухъядерный Core2Duo. Я реализовал многопоточность в медленной области моего приложения, но все еще замечаю, что загрузка процессора никогда не превышает 50%, и она все еще отстает после многих итераций. Это нормально? Я надеялся, что это увеличит мой процессор до 100%, так как я делю его на 4 потока. Почему он все еще может быть ограничен до 50%?

Спасибо

См. Что я делаю не так? (Многопоточность)

для моей реализации, за исключением того, что я исправил проблему с этим кодом

Ответы [ 2 ]

1 голос
/ 07 июля 2010

Глядя на свой код, вы выполняете огромное количество выделений в своем узком цикле - на каждой итерации вы динамически выделяете два двухэлементных вектора, а затем помещаете их обратно в вектор результата (создавая копии обоих эти векторы); последний толчок назад иногда вызывает перераспределение и копирование векторного содержимого.

Распределение кучи относительно медленное, даже если ваша реализация использует быстрый распределитель фиксированного размера для небольших блоков. В худшем случае распределитель общего назначения может даже использовать глобальную блокировку; если это так, это уничтожит любые выгоды, которые вы можете получить от многопоточности, поскольку каждый поток будет тратить много времени на ожидание выделения кучи.

Конечно, профилирование скажет вам, ограничивает ли выделение кучи вашу производительность или это что-то еще. Я бы сделал два конкретных предложения, чтобы сократить ваши кучи:

  • Поскольку каждый экземпляр внутреннего вектора имеет два элемента, вам следует рассмотреть возможность использования std::array (или std::tr1::array или boost::array); array «контейнер» не использует выделение кучи для своих элементов (они хранятся как массив C).
  • Поскольку вы примерно знаете, сколько элементов вы собираетесь поместить в вектор результатов, вы можете reserve() оставить достаточно места для этих элементов перед их вставкой.
1 голос
/ 07 июля 2010

По вашему описанию у нас очень мало работы, но давайте посмотрим, смогу ли я помочь:

Вы внедрили систему, основанную на блокировке, но не используете разумно ресурсы второго, третьего или четвертого потоков, поскольку требуемая им сущность постоянно блокируется.(это очень реальная и очевидная область, которую я бы рассмотрел в первую очередь) На самом деле вы не используете более одного потока.Каким-то образом эти другие потоки даже не запускаются и не инициализируются.(звучит глупо, но я делал это раньше)

Сначала изучите эти области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...