Системные API потоков (такие как потоки POSIX) требуют, чтобы вы выполняли огромную работу вручную (настройку потоков, разделение работы между потоками, синхронизацию, когда они завершены, разрыв потоков и т. Д.) , Много и много кода, который скрывает то, что вы действительно пытаетесь сделать. И подвержен ошибкам. И утомительно. И зависит от платформы.
OpenMP сделает все это за вас. На мой взгляд, он наиболее подходит для параллелизма данных ; во многих случаях это так же просто, как поместить директиву #pragma omp
перед, например, цикл for
, и этот цикл будет автоматически многопоточным. Но его также можно использовать для параллелизма задач .
OpenMP не улучшает производительность , в том смысле, что всегда можно написать ручной код многопоточности, который выполняет как минимум ту же версию, что и версия OpenMP. Но очень часто OpenMP дает вам + 90% от теоретической оптимальной производительности с 5 минутами кодирования (при условии, что вы сначала написали свои циклы дружественным к потокам способом).
Я рекомендую прочитать статью Википедии , чтобы найти несколько хороших примеров.