В настоящее время я работаю над проектом, который сочетает в себе высокопроизводительные вычисления (HPC) и интерактивность.
Таким образом, часть HPC опирается на OpenMP (в основном циклы for с множеством идентичных вычислений), но она включена в более крупную структуру. с графическим интерфейсом и многопоточностью, в настоящее время достигаемой с помощью потоков С++ 11 (std::thread
и std::async
).
Я прочитал Хорошо ли работает OpenMP с промисами и фьючерсами C++? и Почему потоки С++ 11 становятся неприсоединяемыми, когда с помощью вложенных прагм OpenMP? что не стоит смешивать потоки OpenMP и C++11, но до сих пор это работало для меня.
По разным причинам я хотел бы улучшить это, но я не уверен, какую стратегию принять.
В разделе потоки OpenMP vs C++11 я прочитал, что замена OpenMP на std::thread
оказывает значительное влияние на производительность из-за создания и уничтожения потоков, но я не смог найти ничего о замене ускорения OpenMP параллелизмом на основе задач с std::async
. На мой взгляд, это должно быть быстрее, чем std::thread
, потому что тогда управление потоками осуществляется операционной системой, но я пока не уверен, что это применимо. Я еще не пробовал, потому что это потребует множества рефакторингов, и я хотел бы сначала услышать другие мнения.
Есть ли у вас опыт согласования высокопроизводительных вычислений и интерактивности? На ваш взгляд, должен ли std::async
быть сравнимым по скорости с OpenMP?
std::thread
также управляется операционной системой. В конечном счете, и OpenMP, иstd::thread
являются оболочкой собственных средств многопоточности ОС. Ничто само по себе не делает ни одну из них более или менее родной. - person ShadowRanger   schedule 16.12.2015std::async
, чем сstd::thread
, если я правильно помню, что Скотт Мейерс говорит в «Эффективном современном C++». Таким образом, я думал, что ОС сама смотрит, нужно ли создание потока, уничтожение и т. д. или нет, и что в конечном итоге производительность должна быть лучше. Разве это не правильно? - person oLen   schedule 17.12.2015