Доступные параллельные технологии в .Net

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

  • Параллельная задача в параллельной библиотеке задач, которая представляет собой .Net 3.5.

  • PLINQ,.Net 4.0

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

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

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

Ответ 1

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

Сверху моей головы существует несколько способов многопоточности:

  • Thread класс.
  • ThreadPool, который также поддерживает операции с привязкой к I/O и порт завершения ввода/вывода.
  • Begin*/End* асинхронные операции.
  • Компоненты асинхронного программирования на основе событий (или "EBAP" ), которые используют SynchronizationContext.
  • BackgroundWorker, который является EBAP, который определяет асинхронную операцию.
  • Task класс (параллельная библиотека задач) в .NET 4.
  • Параллельный LINQ. хорошая статья в Parallel.ForEach(параллельная библиотека задач) по сравнению с PLINQ.
  • Rx или "LINQ to Events", который еще не имеет не-бета-версии, но близится к завершению и выглядит многообещающим.
  • (только F #) Асинхронные рабочие процессы.

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Существует также Reactive Extensions для .NET(Rx)

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

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

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

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

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

Ответ 5

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

Параллельная библиотека задач

Ответ 6

двумя основными способами параллельной работы являются потоки и новая TPL на основе задач.

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

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

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

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

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

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

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

  • Тема
  • Новая задача, планировщик задач.

Очевидно, задача основана на том, как идти.

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