Подтвердить что ты не робот

Concurrency не Parallelism?

Здесь находятся слайды Роб Пайка. Каждый раз, когда я иду через это, я чувствую себя дебилом. Я не могу понять суть этого. Хорошо известно, что concurrency представляет собой разложение сложной задачи на более мелкие компоненты. Если вы не можете правильно делить что-то на более мелкие части, его трудно решить, используя concurrency.

Но в слайдах не так много подробностей о том, как получить parallelism после достижения concurrency. На слайде урока (номер 52) он говорит, что concurrency - "Возможно даже параллельный". Но вопрос: Когда и как concurrency корректно и эффективно приведет к Parallelism?

Моя догадка заключается в том, что под капотом Rob указывает, что разработчики должны работать на уровне concurrency - и parallelism должен быть проблемой языка /vm (gomaxprocs?). Просто забота об интеллектуальном разложении на более мелкие единицы, касающаяся только правильного concurrency - parallelism, будет заботиться о "системе".

Просветите свет.

4b9b3361

Ответ 1

Что означает Роб Пайк

Когда у вас есть абстрактная форма алгоритма, вы должны выбрать, будете ли вы реализовывать его с помощью Message Passing или Shared Memory или, возможно, Hybrid. Вам также нужно будет рассмотреть тип доступа к памяти (NUMA, UMA и т.д.) И используемую топологию (Hypercube, Torus, Ring, Mesh, Tree и т.д.)

Это кажется большой работой для тех, кто просто хочет чего-то, может быть, даже простого, сделать параллельно (например, параллельно).

И это большая работа, особенно если вы измените топологию (так что вы можете иметь все свои преимущества).

Итак, вы пишете параллельный код (будь то простой или сложный), а VM или компилятор выбирает то, что, по-видимому, лучший способ, даже запускать его последовательным образом! ( примером может служить параллельная библиотека задач для .net)

Важный EDIT:

Я должен упомянуть, что я говорю о concurrency в программе/алгоритме, а не между независимыми программами, которые запускаются в системе.

Вы сказали, что

Хорошо известно, что concurrency представляет собой разложение сложной задачи на более мелкие компоненты. Если вы не можете правильно делить что-то на более мелкие части, трудно решить его с помощью concurrency

но это не так. b/c эти более мелкие компоненты могут зависеть друг от друга последовательным образом, поэтому, даже если вы разделитесь на небольшие компоненты, это не значит, что вы достигнете concurrency/parallelism.

Во всех моих классах параллельных и распределенных алгоритмов (как в BS, так и MS) мы никогда не говорили о "concurrency, который мы получили, а теперь посмотрим, как получить parallelism". Если вы используете слово concurrency для описания и алгоритма, то вы подразумеваете parallelism и наоборот.

В литературе вы также найдете тонкую грань между распределенными и параллельными.

С алгоритмической точки зрения вы можете использовать concurrency, parallelism и распределены, и вы получите ту же идею.

С точки зрения реализации, если вы говорите "parallelism", вы обычно намереваетесь использовать программу, которая выполняется на локальном компьютере или кластере (общая память), и "распределяется" при запуске программы на сетке (Передача сообщений).

Теперь и распределенные, и parallelism подразумевают concurrency.

Я думаю, вы должны скептически относиться к точному смыслу этих терминов, потому что даже в литературе (и я говорю о людях, которые действительно способствовали этой области, а не только о создании какого-то языка), они используются для выражения абстрактного концепция.

Concurrency по алгоритму (будь то программа) означает наличие фрагментов кода, которые могут работать независимо от других фрагментов кода, даже если они в конечном итоге ожидают некоторые другие фрагменты кода (проверьте закон Amdahl, чтобы увидеть точно следствием этого).

Поэтому, когда у вас есть concurrency в алгоритме/программе, у вас также есть parallelism.

Я думаю, что лучше просто реализовать некоторые параллельные и распределенные алгоритмы, чтобы лучше понять идею, стоящую за ней. Если вы знаете C/С++, вы можете использовать OpenMPI для реализации распределенных (Message Passing) и OpenMP для параллельных (Shared Memory) реализаций.

EDIT:

Он мог также означать concurrency как абстрактный принцип и параллельный, как способ его реализации [Общая память, передача сообщений, гибрид между ними; Тип доступа к памяти (numa, uma и т.д.)].