Я понимаю, что мой ответ довольно длинный, поэтому я делаю вывод первым для нетерпеливых:
Краткий ответ:
Я бы сказал, openMP и pthreadsпо сути одинаковы, и вы должны выбрать тот, который требует от вас наименьшего времени разработки (возможно, openMP, если вам это нужно).Но если вы хотите потратить время на разработку, возможно, вам следует изменить код, чтобы он мог адаптироваться к другим парадигмам (например, векторизации для использования преимуществ SSE / AVX или графических процессоров).
Разработка:
Если вы разрабатываете линейные решатели, я предполагаю, что ваш код будет (очень) долгоживущим (т.е. он, вероятно, переживет физические модели, которые будут его использовать).В таких условиях, особенно если у вас нет большой команды разработчиков, я думаю, что вы должны основывать свой выбор в первую очередь на времени разработки, удобстве обслуживания и
Кроме того, вы не должны предполагать, что «лучший» выбор сегодня(что бы ни значило «лучшее»), вероятно, завтра не будет «лучшим» выбором.Таким образом, даже если вы столкнулись с проблемой openMP против pthreads сейчас (и даже сейчас спектр уже больше, чем, как сказано в ответе @ HighPerformanceMark), вы должны ожидать, что у вас будет больше вариантов на выборбудущее.
Если у вас есть время на разработку сейчас, я бы сказал, что было бы лучше инвестировать, если бы вы могли абстрагировать все вычислительные ядра в своем коде таким образом, чтобы вы могли легко адаптировать их кразные парадигмы распараллеливания.В этом отношении наиболее важной (и сложной) вещью, с которой приходится иметь дело, является структура данных: для извлечения выгоды из объединения для вычислений GPGPU необходимо расположить ваши данные в другом порядке, нежели традиционный способ оптимизации кэша.
Что приводит меня к выводуВ заключение: все решения на основе потоков по существу эквивалентны (как с точки зрения производительности, так и архитектуры кода), и вы должны выбрать, какое решение требует наименьшего времени на разработку.Но если вы хотите потратить время на разработку, возможно, вам следует изменить код, чтобы он мог быть распараллелен или векторизован (и таким образом использовать преимущества SSE / AVX или графических процессоров).Если вам удастся это сделать, вы сможете следить за развитием аппаратного и программного обеспечения и поддерживать производительность.