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