Параллельное программирование == программирование мультипотока?
Многопоточное программирование является параллельным, но параллельное программирование не обязательно является многопоточным.
Если многопоточность не выполняется на одном ядре, в этом случае она только параллельна.
Не обязательно . Вы можете распределять задания между несколькими процессами и даже несколькими машинами - я бы не стал классифицировать это как «многопоточное» программирование, поскольку каждый процесс может использовать только один поток, но это, безусловно, параллельное программирование. По общему признанию, вы могли бы тогда возразить, что с несколькими процессами в системе в целом есть несколько потоков ...
В конечном итоге, подобные определения полезны только в контексте. В вашем конкретном случае какая разница? Или это просто ради интереса?
Нет. Многопоточное программирование означает, что у вас есть один процесс, и этот процесс генерирует группу потоков. Все потоки выполняются одновременно, но все они находятся в одном пространстве процессов: они могут обращаться к одной и той же памяти, иметь одинаковые дескрипторы открытых файлов и т. д.
Параллельно программирование - это более «общее» определение.в MPI вы выполняете параллельное программирование, выполняя один и тот же процесс несколько раз, с той разницей, что каждый процесс получает свой «идентификатор», поэтому при желании вы можете различать каждый процесс, но это не обязательно. Кроме того, эти процессы независимы друг от друга, и они должны взаимодействовать через каналы или сетевые / unix-сокеты. Библиотеки MPI предоставляют определенные функции для перемещения данных между узлами в синхронном или асинхронном стиле.
В отличие от этого, OpenMP обеспечивает распараллеливание с помощью многопоточности и разделяемой памяти. Вы указываете компилятору специальные директивы, и он автоматически выполняет параллельное выполнение за вас.
Преимущество OpenMP в том, что он очень прозрачен. Есть цикл для распараллеливания? просто добавьте пару директив, и компилятор разбивает ее на части и назначает каждую часть цикла другому процессору. К сожалению, для этого вам нужна архитектура с общей памятью. Кластеры с узловой архитектурой не могут использовать OpenMP на уровне кластера. MPI позволяет вам работать с архитектурой на основе узлов, но вы должны расплачиваться за более сложное и непрозрачное использование.