Доступные параллельные технологии в .Net - PullRequest
10 голосов
/ 21 мая 2010

Я новичок в платформе .Net.Я выполнил поиск и обнаружил, что в .Net есть несколько способов сделать параллельные вычисления:

  1. Параллельное задание в Task Parallel Library, которая является .Net 3.5.

  2. PLINQ, .Net 4.0

  3. Асинхронное программирование, .Net 2.0, (асинхронное в основном используется для выполнения сложных задач ввода-вывода, F #имеет краткий синтаксис, поддерживающий это).Я перечисляю это, потому что в Mono, кажется, нет TPL или PLINQ.Таким образом, если мне нужно написать кроссплатформенные параллельные программы, я могу использовать async.

  4. .Net темы.Нет ограничений по версии.

Не могли бы вы дать несколько коротких комментариев по ним или добавить больше методов в этот список?

Ответы [ 6 ]

15 голосов
/ 21 мая 2010

Вам нужно провести немало исследований, чтобы определить, как эффективно использовать многопоточность. Есть несколько хороших технических статей , часть сайта Microsoft Parallel Computing .

Вдоль моей головы, есть несколько способов сделать многопоточность:

  1. Thread класс.
  2. ThreadPool, который также поддерживает операции ввода-вывода и порт завершения ввода-вывода.
  3. Begin* / End* асинхронные операции.
  4. Компоненты асинхронного программирования на основе событий (или «EBAP»), использующие SynchronizationContext.
  5. BackgroundWorker, который представляет собой EBAP, определяющий асинхронную операцию.
  6. Task класс (параллельная библиотека задач) в .NET 4.
  7. Параллельное LINQ. Есть хорошая статья о Parallel.ForEach (Task Parallel Library) против PLINQ.
  8. Rx или «LINQ to Events», которая еще не имеет бета-версии, но близится к завершению и выглядит многообещающе.
  9. (только F #) Асинхронные рабочие процессы.

Обновление: есть статья Понимание и применение параллельных шаблонов с помощью .NET Framework 4 , доступная для загрузки, в которой указано, какие решения использовать для каких типов параллельных сценариев (хотя предполагается, что .NET 4 и не покрывает Rx).

11 голосов
/ 21 мая 2010

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

Параллельно означает, что «задача» разбита на несколько меньших под-«задач», которые могут быть запущены одновременно,Для этого требуется многоядерный процессор или многопроцессорный компьютер, где каждая задача имеет свое выделенное ядро ​​или процессор.Или несколько компьютеров.PLINQ (параллелизм данных) и TPL (параллелизм задач) попадают в эту категорию.

Асинхронный означает, что задачи выполняются без блокировки друг друга.Асинхронное выражение F #, Rx, Begin / End pattern являются API-интерфейсами для асинхронного программирования.

Параллельность - это более широкое понятие, чем распараллеливание и асинхронность.Параллельность означает, что несколько «задач» выполняются одновременно, взаимодействуя друг с другом.Но эти «задачи» не должны выполняться на отдельных физических вычислительных блоках, как подразумевается при распараллеливании.Например, многозадачные операционные системы могут выполнять несколько процессов одновременно даже на одноядерных компьютерах с одним процессором, используя временные интервалы.Параллельность может быть достигнута, например, с помощью модели Actor и передачи сообщений (например, почтовый ящик F #, процессы Erlang (Retlang в .Net))

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

4 голосов
/ 22 мая 2010

Существуют также некоторые библиотеки .NET для параллельного программирования данных, предназначенные для графического процессора (GPU), включая:

Microsoft Accelerator предназначен для параллельного программирования данных и может работать как с GPU, так и с многоядерными процессорами.

Brama предназначен для преобразований данных в стиле LINQ, которые выполняются на графическом процессоре.

CUDA.NET предоставляет оболочку, позволяющую CUDA использоваться из программ .NET.

3 голосов
/ 21 мая 2010

Существует также Реактивные расширения для .NET (Rx)

Rx - это в основном запросы linq для событий. Он позволяет обрабатывать и комбинировать асинхронные потоки данных так же, как linq позволяет работать с коллекциями. Так что вы, вероятно, будете использовать его в сочетании с другими параллельными технологиями как способ объединения результатов ваших параллельных операций, не беспокоясь о блокировках и других низкоуровневых примитивах потоков.

Эксперт эксперту: Брайан Бекман и Эрик Мейер - Внутри .NET Reactive Framework (Rx) дает хороший обзор того, что такое Rx.

РЕДАКТИРОВАТЬ: Другая библиотека, заслуживающая упоминания, - это среда параллелизма и координации (CCR), она существует уже давно (ранее '06) и поставляется как часть Microsoft Robotics. Studio .

Rx имеет много таких же классных идей, что и CCR, но с гораздо более приятным API, на мой взгляд. В CCR есть еще кое-что интересное, так что, возможно, стоит проверить. Существует также структура распределенных сервисов, которая работает с CCR, что может сделать ее полезной в зависимости от того, что вы делаете.

Эксперт к эксперту: Мейер и Хризантакопулос - параллелизм, координация и CCR

2 голосов
/ 21 мая 2010

Еще одна новая библиотека параллельных задач в .NET 4.0, которая похожа и соответствует тому, что вы уже обнаружили, но это может быть интересным прочтением:

Задача параллельной библиотеки

0 голосов
/ 22 мая 2010

два основных способа параллельной работы - это потоки и новая библиотека задач на основе задач TPL.

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

PLINQ, Rx и другие, упомянутые выше, на самом деле являются расширениями, расположенными в верхней части нового планировщика задач.

лучшая статья, объясняющая в точности новую архитектуру для нового планировщика задач и всех библиотек на нем, Visual Studio 2010 и нового параллелизма на основе задач TPL .NET 4.0, здесь (Стив Тейшейра, менеджер подразделения продукта для Parallel Developer Инструменты в Microsoft):

http://www.drdobbs.com/visualstudio/224400670

В противном случае доктор Доббс выделил здесь раздел параллельного программирования: http://www.drdobbs.com/go-parallel/index.jhtml

Основное различие между, скажем, потоками и новым параллельным программированием на основе задач заключается в том, что вам больше не нужно думать о потоках, о том, как вы больше управляете пулами, базовой ОС и оборудованием. TPL заботится о том, чтобы вы просто использовали задания. Это огромное изменение в том, как вы проводите параллели на любом уровне, включая абстракцию.

Так что в .NET на самом деле у вас не так много вариантов:

  1. Тема
  2. Новая задача на основе планировщика задач.

Очевидно, что основанная на задании задача - путь.

веселит Валько

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...