Рекомендации по превращению библиотеки классов .NET в многопоточную библиотеку классов .NET

У меня есть несколько библиотек классов C #, которые были разработаны без учета таких вещей, как параллелизм, несколько потоков, блокировки и т. Д.

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

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

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


person ileon    schedule 10.03.2010    source источник


Ответы (4)


Я настоятельно рекомендую изучить .NET 4 и Task Parallel Библиотека (также доступна в .NET 3.5sp1 через Rx Framework).

Это значительно упрощает многие проблемы параллелизма, в частности, значительно упрощается параллелизм данных. Поскольку вы имеете дело с большими наборами данных в большинстве научных / инженерных библиотек, параллелизм данных часто является лучшим решением ...

Для получения некоторых справочных материалов, особенно о параллелизме данных и предыстории декомпозиции и решения проблемы, вы можете прочитать серию моих блогов на Параллелизм в .NET 4.

person Reed Copsey    schedule 10.03.2010
comment
@Reed Copsey: параллелизм данных значительно упрощается. Можете быть более конкретными? Мне кажется, что стало проще только выполнение параллельных задач ... вы говорите, что параллелизм данных становится проще, потому что вы можете выполнять параллельные задачи для каждого элемента в своей коллекции, из-за PLINQ или потому что есть что-то, что снижает конкуренцию проще? - person Kiril; 10.03.2010
comment
+1. Я еще не пробовал использовать 4 задачи / потоки, но я слушал подкаст, и было приложено много усилий, чтобы упростить его, как с точки зрения инструментов / IDE, так и с точки зрения абстракции API. Я с нетерпением жду возможности покопаться, когда мне понадобится. @ipapasa, помните, что предложение Рида в значительной степени совпадает с предложением @John Saunders. Играйте, прежде чем портировать товар. - person kenny; 10.03.2010
comment
@Lirik: параллелизм данных становится намного проще благодаря новым конструкциям, таким как параллельный класс, но тем более благодаря автоматической обработке многих сценариев агрегации (либо через PLINQ, либо через конструкции параллельного цикла локального состояния), а также благодаря введению многих новые поддерживающие параллельные классы данных. - person Reed Copsey; 10.03.2010

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

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

Возможно, что при использовании библиотеки параллельных задач .NET 4.0 упростит работу, но не устранит полностью разрыв между кодом, который не был разработан как параллельный, и другим кодом.

person John Saunders    schedule 10.03.2010
comment
Джон, ты меня пугаешь! Но опять же, вы правы. Говоря, что код хорошо структурирован, я подразумеваю, что некоторые части, алгоритмы, возможно, можно переписать с нуля. - person ileon; 10.03.2010
comment
@ipapasa: Я хочу тебя напугать. Я отлаживал подобные вещи, а может быть, и вы нет. Это из тех вещей, которые вызывают кошмары. Это сложно, когда вы делаете дизайн с нуля. Я видел, как код операционной системы облажался! При всем уважении, но я не думаю, что у вас все получится. - person John Saunders; 10.03.2010
comment
@John: Я ценю то, что вы говорите, и, честно говоря, я серьезно к этому отношусь. - person ileon; 10.03.2010
comment
@John: Я считаю это невероятно коротким. Игнорировать параллелизм больше неприемлемо - он должен быть инструментом в наборе инструментов каждого профессионального программиста, и у большей части последовательного кода есть возможность использовать параллелизм, не вызывая проблем. Научный код, как правило, сильно ориентирован на данные, и с ним часто довольно просто работать, используя методы параллелизма данных. Я согласен с тем, что необходимо проявлять осторожность, но считаю, что это ДОЛЖНО быть сделано. - person Reed Copsey; 10.03.2010
comment
@Reed: Я не говорил игнорировать параллелизм - я сказал, что он должен писать свой код с учетом параллелизма, а не преобразовывать последовательный код в параллельный код, используя базу разработчиков, не привыкшую к проблемам параллелизма. - person John Saunders; 10.03.2010
comment
@John: Дело в том, что в какой-то момент вам придется начать пытаться использовать параллелизм в коде, который был написан последовательно. Иногда это требует переписывания, но очень часто есть (по крайней мере небольшие) выгоды, которые можно получить без полного перепроектирования или переписывания. - person Reed Copsey; 10.03.2010
comment
@Reed: это может относиться к разработчикам, сталкивающимся с проблемами параллелизма. Похоже, это не относится к OP. Я сильно подозреваю, что если они попытаются распараллелить этот существующий, знакомый код, они убаюкивают себя и упустят то, что им нужно сделать по-другому. Если вместо этого они сосредоточатся на изучении того, как создавать высококачественные параллельные алгоритмы, тогда они смогут взять свое знакомство с существующим кодом и применить его к прочной параллельной основе. - person John Saunders; 10.03.2010
comment
@John, @Reed: ваш вклад ценный. Из этого разговора я понял, что (а) это непростая задача; недостаток знаний может привести к кошмарам, как сказал Джон (так что нам нужно сильное подкрепление), (б) научный код может выиграть от параллелизма данных, и мы должны следовать ему (Рид), (в) если мы хотим вникнуть в проблемы параллелизма, очевидно, мы должны изменить способ мышления и написания кода (Джон). - person ileon; 12.03.2010

Если у вас нет опыта работы с многопоточностью, я бы порекомендовал вам сначала ознакомиться с основами, просмотрев различные ресурсы: https://stackoverflow.com/questions/540242/book-or-resource-on-c-concurrency

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

Лучшее параллельное программное обеспечение не требует блокировки и ожидания ... этого трудно достичь в C # (.NET), поскольку большинство ваших коллекций не являются свободными от блокировки, ожидания или даже потокобезопасными. Существуют различные обсуждения структур данных без блокировки. Многие люди ссылались на статьи Бойе (которые ДЕЙСТВИТЕЛЬНО хороши), а некоторые люди предлагал параллельную библиотеку задач в качестве следующего элемента параллелизма .NET, но TPL действительно не дает вам многого с точки зрения поточно-ориентированных коллекций.

.NET 4.0 выходит с коллекциями .Concurrent, что должно очень помочь.

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

person Kiril    schedule 10.03.2010
comment
Примечание. Упомянутый вопрос удален. В вопросе рекомендована книга Джо Даффи: Параллельное программирование в Windows, эта веб-статья: Threading в C # и эта книга: Руководство по потокам в C # - person jrh; 23.02.2017

Лучше всего начать с http://msdn.microsoft.com/en-us/concurrency/default.aspx

Удачи!

person Diego Mijelshon    schedule 10.03.2010