Минимальный объем работы стоит создать новую тему

Как я могу оценить минимальный объем работы, ради которого стоит создать новый поток? Меня в основном интересует C++11 std::thread.

Длинное объяснение. Я пытался ускорить наше приложение, поэтому я продолжил распараллеливать низкоуровневую функцию, которая выполняет очень мало простых операций (например, неравенства и присваивания) в цикле. Однако эта функция занимает больше всего времени в приложении. Поэтому я попытался распараллелить цикл, порождающий два потока для двух последовательных индексов цикла, но это убило производительность (я не могу точно сказать фактор замедления, но он может быть примерно в 100 раз).


person Paolo M    schedule 17.04.2015    source источник
comment
Вы смотрели в опенмп? bisqwit.iki.fi/story/howto/openmp Мне часто кажется, что это намного проще использовать, чем порождать совершенно новый поток, особенно если вам просто нужно ускорить циклы здесь и там.   -  person Bas in het Veld    schedule 17.04.2015
comment
два последовательных индекса очень похожи на ложное совместное использование или перебор кеша. Кешу вашего процессора это совсем не понравится, никакого ускорения может и не быть. Лучше разбейте цикл на непрерывные области и назначьте нити этим областям. Например. первую половину в первую нить, вторую половину во вторую нить.   -  person Markus Kull    schedule 17.04.2015
comment
Не создавайте новый поток, назначьте задачу существующему потоку. Повторно используйте свои потоки, если вы заботитесь о производительности.   -  person David Schwartz    schedule 17.04.2015
comment
@BasinhetVeld Это будет моя следующая попытка, спасибо.   -  person Paolo M    schedule 17.04.2015
comment
@MarkusKull Проблема в том, что мой цикл получил условие выхода, поэтому очень вероятно, что вторая половина цикла всегда должна ждать завершения первой половины. В любом случае, я углублюсь в вопросы false sharing и кеша, это звучит довольно интересно.   -  person Paolo M    schedule 17.04.2015
comment
@DavidSchwartz Как этого можно добиться с помощью С++ 11 std::thread? Кстати, я прочитал здесь stackoverflow.com/a/14351457/2508150, что нет особого удобства в объединении потоков под линуксом.   -  person Paolo M    schedule 17.04.2015
comment
@PaoloM Вы можете реализовать потокобезопасную ожидаемую очередь из std::function объектов, чтобы потоки извлекали из этой очереди и выполняли объект.   -  person David Schwartz    schedule 17.04.2015
comment
@DavidSchwartz Хорошо, но, насколько я понимаю, C++ 11 std::threads нельзя использовать повторно. Я не вижу способа переназначить задачу существующему std::thread.   -  person Paolo M    schedule 17.04.2015
comment
@PaoloM Вы читали комментарий, на который отвечаете?! Там точно объяснили, как это сделать!   -  person David Schwartz    schedule 18.04.2015
comment
@DavidSchwartz На самом деле я не пытаюсь полемизировать. Я просто не понимаю, как я могу повторно использовать ваши потоки, если вы заботитесь о производительности, используя std::thread. Я все еще не понимаю, извините.   -  person Paolo M    schedule 18.04.2015
comment
@PaoloM Почему бы тебе не задать отдельный вопрос? Любой компетентный программист, который использовал потоки, должен понимать, что реализует потокобезопасную, ожидаемую очередь объектов std::function и заставляет потоки извлекаться из этой очереди и выполнять средства объекта. Это основной способ повторного использования потоков.   -  person David Schwartz    schedule 20.04.2015
comment
Послушайте, @DavidSchwartz, мой английский не очень хорош, поэтому я не могу объяснить, чего не понимаю. Кстати, ни разу не сказал грамотный программист, который использовал потоки. Ваше здоровье.   -  person Paolo M    schedule 20.04.2015
comment
@PaoloM Задайте вопрос о том, как повторно использовать C++ 11 std::threads, и я объясню.   -  person David Schwartz    schedule 20.04.2015
comment
@DavidSchwartz На прошлой неделе я пытался, но он был помечен как дубликат stackoverflow.com/questions/26516683/reusing-thread-in-loop-c. Существует также stackoverflow.com/questions/26417369/. Если можете, ответьте на один из этих вопросов и, пожалуйста, дайте мне знать. Спасибо.   -  person Paolo M    schedule 20.04.2015
comment
@PaoloM Вот пожалуйста.   -  person David Schwartz    schedule 20.04.2015
comment
@DavidSchwartz Спасибо! Я попробую это и посмотрю, получу ли я какое-то ускорение.   -  person Paolo M    schedule 20.04.2015


Ответы (1)


Создание нового потока часто является дорогостоящей операцией (возможно, больше в Windows, в Linux это дешевле). Одной из альтернатив является использование шаблона проектирования пула потоков. Это позволяет повторно использовать существующие потоки, не создавая/уничтожая их все время.

Минимальный объем работы, когда использование многопоточности выгодно, трудно оценить без дополнительных знаний об используемой архитектуре и среде, в которой работает приложение. Некоторый опыт или эксперименты были бы полезны.

person rubix_addict    schedule 17.04.2015