Я плохо знаком с платформой .NET. Я сделал поиск и нашел, что существует несколько способов сделать параллельные вычисления в .NET:
Параллельная задача в Библиотеке Параллели Задачи, которая является.Net 3.5.
PLINQ.Net 4.0
Программирование Asynchounous.Net 2.0, (асинхронный главным образом используется, чтобы сделать ввод-вывод тяжелые задачи, F#, имеют краткий синтаксис, поддерживающий это). Я перечисляю это, потому что в Моно, кажется, нет никакого TPL или PLINQ. Таким образом, если я должен записать кросс-платформенные параллельные программы, я могу использовать асинхронный.
Потоки .NET. Никакое ограничение версии.
Вы могли дать некоторые короткие комментарии к ним или добавить больше методов в этом списке?
Вам действительно нужно провести изрядное исследование, чтобы определить, как эффективно использовать многопоточность. Есть несколько хороших технических статей , которые являются частью сайта группы Microsoft Parallel Computing .
Я не понимаю, что есть несколько способов реализовать многопоточность:
Класс Thread
. ThreadPool
, который также поддерживает операции с привязкой к вводу-выводу и порт завершения ввода-вывода. Начать *
/ Конец *
асинхронных операций. SynchronizationContext
. BackgroundWorker
- протокол EBAP, определяющий асинхронную операцию. Класс задачи
(библиотека параллельных задач) в .NET 4. Обновление: есть статья Понимание и применение параллельных шаблонов с .NET Framework 4 , доступная для загрузки, которая дает некоторые указания, какие решения использовать для каких типов параллельных сценариев (хотя предполагается, что .NET 4 и не покрывает Rx).
Еще одна новая параллель задач. библиотека в .NET 4.0, которая похожа и соответствует тому, что вы уже обнаружили, но это может быть интересное чтение:
Также есть Реактивные расширения для .NET (Rx)
Rx - это в основном запросы linq для событий. Он позволяет обрабатывать и комбинировать асинхронные потоки данных так же, как linq позволяет работать с коллекциями. Таким образом, вы, вероятно, использовали бы его в сочетании с другими параллельными технологиями как способ объединения результатов ваших параллельных операций, не беспокоясь о блокировках и других примитивах потоковой передачи низкого уровня.
От эксперта к эксперту: Брайан Бекман и Эрик Мейер - Внутри .NET Reactive Framework (Rx) дает хорошее представление о том, что такое Rx.
РЕДАКТИРОВАТЬ: Еще одна заслуживающая упоминания библиотека - это Concurrency and Coordination Runtime (CCR), она существует уже давно (до '06) и поставляется как часть Microsoft Robotics Studio ].
В Rx есть много тех же интересных идей, что и в CCR, но, на мой взгляд, с гораздо более приятным API. В CCR все еще есть кое-что интересное, так что, возможно, стоит проверить. Также существует структура распределенных сервисов, которая работает с CCR, что может сделать ее полезной в зависимости от того, что вы делаете.
От эксперта к эксперту: Мейер и Хризантакопулос - Параллелизм, координация и CCR
Два основных способа выполнения параллельных операций - это потоки и новая библиотека на основе задач TPL.
Асинхронное программирование, о котором вы говорите, - это не что иное, как один новый поток в пуле потоков.
PLINQ, Rx и другие упомянутые на самом деле расширения, расположенные в верхней части нового планировщика задач.
лучшая статья, объясняющая именно новую архитектуру для нового планировщика задач и всех библиотек на его вершине, Visual Studio 2010 и новый параллелизм на основе задач TPL .NET 4.0, находится здесь (Стив Тейшейра, менеджер подразделения продукта для параллельных разработчиков Инструменты в Microsoft):
http://www.drdobbs.com/visualstudio/224400670
в противном случае доктор Доббс выделил здесь секцию параллельного программирования: http://www.drdobbs.com/go-parallel /index.jhtml
Основное различие между упомянутыми потоками и параллельным программированием на основе новых задач заключается в том, что вам больше не нужно думать в терминах потоков, как вы больше управляете пулами, базовой ОС и оборудованием. TPL позаботится о том, чтобы вы просто использовали задачи. Это огромное изменение в способах параллельной работы на любом уровне, включая абстракцию.
Итак, в .NET на самом деле у вас не так много вариантов:
Очевидно, что основанный на задаче путь - это путь.
ура Валко
Строго говоря, здесь следует провести различие между параллельной, асинхронной и параллельной работой.
Параллельный означает, что "задача" разбивается на несколько более мелких подзадач, которые могут выполняться одновременно. Для этого требуется многоядерный процессор или компьютер с несколькими процессорами, где каждая задача имеет свое выделенное ядро или процессор. Или несколько компьютеров. PLINQ (параллелизм данных) и TPL (параллелизм задач) относятся к этой категории.
Асинхронный означает, что задачи выполняются, не блокируя друг друга. Выражение async в F#, Rx, паттерн Begin/End - все это API для асинхронного программирования.
Параллелизм - понятие более широкое, чем параллелизация и асинхронность. Параллелизм означает, что несколько "задач" выполняются в одно и то же время, взаимодействуя друг с другом. Но эти "задачи" не обязательно должны выполняться на отдельных физических вычислительных блоках, как это подразумевается при распараллеливании. Например, многозадачные операционные системы могут выполнять несколько процессов одновременно даже на одноядерных компьютерах с одним процессором, используя временные срезы. Параллельность может быть достигнута, например, с помощью модели Actor и передачи сообщений (например, почтовый ящик в F#, процессы Erlang (Retlang в .Net))
Потоки - это относительно низкоуровневая концепция по сравнению с вышеперечисленными концепциями. Потоки - это задачи, выполняемые внутри процесса, работающие параллельно и управляемые непосредственно планировщиком операционной системы. Вы можете реализовать параллелизацию, когда операционная система сопоставляет каждый поток с отдельным ядром, или акторную модель, реализуя очередь сообщений, маршрутизацию и т.д. на каждом потоке.
Существуют также некоторые библиотеки .NET для параллельного программирования данных, предназначенные для графического процессора (GPU), включая:
Microsoft Accelerator предназначен для параллельного программирования данных и может работать как с графическим процессором, так и с многоядерными процессорами.
Brama предназначена для преобразований данных в стиле LINQ, которые выполняются на графическом процессоре.
CUDA.NET предоставляет оболочку, позволяющую использовать CUDA из программ .NET.