Многопоточность OpenMP и C++11

В настоящее время я работаю над проектом, который сочетает в себе высокопроизводительные вычисления (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?


person oLen    schedule 16.12.2015    source источник
comment
это должно быть быстрее, чем std::thread, потому что тогда управление потоком осуществляется операционной системой ‹-- std::thread также управляется операционной системой. В конечном счете, и OpenMP, и std::thread являются оболочкой собственных средств многопоточности ОС. Ничто само по себе не делает ни одну из них более или менее родной.   -  person ShadowRanger    schedule 16.12.2015
comment
Я имел в виду, что у ОС больше свободы в выполнении задачи с вызовом std::async, чем с std::thread, если я правильно помню, что Скотт Мейерс говорит в «Эффективном современном C++». Таким образом, я думал, что ОС сама смотрит, нужно ли создание потока, уничтожение и т. д. или нет, и что в конечном итоге производительность должна быть лучше. Разве это не правильно?   -  person oLen    schedule 17.12.2015
comment
Вы видели этот вопрос? Что касается согласования, рассматривали ли вы возможность запуска кода высокопроизводительных вычислений в отдельном процессе, а затем взаимодействия графического интерфейса с ним через своего рода IPC? Кроме того, OpenMP — не единственный вариант многопроцессорности — есть Intel TBB, Microsoft C++ AMP и т. д.   -  person Hristo Iliev    schedule 15.01.2016
comment
@HristoIliev Спасибо, ваш ответ определенно полезен!   -  person oLen    schedule 18.01.2016