2015-04-17 2 views
0

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

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

+1

Вы посмотрели на openmp? http://bisqwit.iki.fi/story/howto/openmp/ Я считаю, что это часто гораздо проще в использовании, чем нереститься в совершенно новом потоке, особенно если вам просто нужно ускорить циклы здесь и там. –

+5

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

+0

Не создавайте новый поток, назначьте задачу существующему потоку. Повторно используйте свои потоки, если вы заботитесь о производительности. –

ответ

1

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

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