ответ

32

Многопотоковое программирование является параллельным, но параллельное программирование не обязательно многопоточно.

Если многопоточность не происходит на одном ядре, в этом случае она будет только одновременной.

+2

AFAIK, на одноядерном процессоре, резьба не параллельна. Он параллелен, но не параллелен. –

+0

@Ionut: http: //thesaurus.reference.com/browse/concurrent <- Если вы посмотрите в заголовке «Синонимы» первого результата. –

+5

Разница, которую я делаю между параллельной и параллельной, заключается в том, что параллель действительно одновременна, а одновременная выглядит так, как если бы она была одновременной. Переключение между потоками происходит так быстро, что кажется, что оно параллельное, но это не так. Возможно, есть другие термины, обозначающие это, но это то, что я понимаю. –

28

Не обязательно. Вы можете распространять задания между несколькими процессами и даже несколькими машинами - я бы не классифицировал это как «многопоточное» программирование, так как каждый процесс может использовать только один поток, но это, безусловно, параллельное программирование. По общему признанию, вы могли бы утверждать, что с несколькими процессами в системе есть несколько потоков в целом ...

В конечном итоге такие определения полезны только в контексте. В вашем конкретном случае, какая разница? Или это просто не интересно?

+1

Следует ли также рассматривать SIMD как параллельное программирование? Мы выполняем одни и те же операции с несколькими данными параллельно, но я не знаю, считается ли это, что многопараметризация будет включена в определение параллельного программирования. –

+0

Я бы сказал, что SIMD был более параллельным аппаратным дизайном, но я думаю, что на каком-то уровне вы должны рассмотреть сторону программирования, имеющую выделенное параллельное оборудование, например. как насчет программирования для GPU? –

26

Нет. Многопоточное программирование означает, что у вас есть один процесс, и этот процесс генерирует кучу потоков. Все потоки работают одновременно, но все они находятся под одним и тем же пространством процессов: они могут обращаться к одной и той же памяти, иметь одинаковые дескрипторы открытых файлов и т. Д.

Параллельное программирование является немного более «общим» в качестве определения. в MPI вы выполняете параллельное программирование, запуская один и тот же процесс несколько раз, с той разницей, что каждый процесс получает другой «идентификатор», поэтому, если вы хотите, вы можете различать каждый процесс, но он не требуется. Кроме того, эти процессы независимы друг от друга, и они должны обмениваться данными по каналам или сокетам сети/unix. Библиотеки MPI предоставляют определенные функции для перемещения данных взад и вперед по узлам в синхронном или асинхронном стиле.

В отличие от этого, OpenMP обеспечивает параллелизацию через многопоточность и общую память. Вы указываете специальные директивы для компилятора, и он автоматически выполняет параллельное выполнение для вас.

Преимущество OpenMP в том, что он очень прозрачный. Есть ли цикл для параллелизации? просто добавьте пару директив, а компилятор разбивает их на куски и назначает каждую часть цикла другому процессору. К сожалению, для этого вам нужна архитектура с общей памятью. Кластеры, имеющие узловую архитектуру, не могут использовать OpenMP на уровне кластера. MPI позволяет работать с узловой архитектурой, но вам нужно заплатить более сложное и непрозрачное использование.

+0

ow, так что это означает, что 1 задание обрабатывается n процессом нет 1 задание обрабатывается n потоком –

+0

Я, кажется, помню, что работа _is_ выполняется при распараллеливании в стиле OpenMP для многопроцессорных архитектур ... Я не могу вспомнить если это часть самого OpenMP или что-то еще? –

+1

@Eko: не совсем. MPI запускает n экземпляров одной и той же программы, каждый с другим номером id в специальной переменной (ищите MPI_Comm_Rank). Что делать с этими n экземплярами зависит от вас. –