Как писать приложения .NET, использующие многоядерные процессоры

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


person Josh Stodola    schedule 03.03.2009    source источник


Ответы (8)


Многоядерное программирование — это, по сути, многопоточное программирование. Пока ваше приложение является многопоточным, операционная система будет определять, на каком ядре какой поток выполнять.

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

person Dmitry Brant    schedule 03.03.2009
comment
Для начала, думаю, напишу что-нибудь раскручивающее четыре потока (у меня машина четырехъядерная). Каждый поток будет выполнять отдельное консольное приложение, выполняющее интенсивные вычисления в течение минуты или двух (чтобы резко увеличить нагрузку на ЦП). В этом случае я должен ожидать 100% загрузки процессора, верно? - person Josh Stodola; 03.03.2009
comment
Это должно быть достаточно точно. - person Dmitry Brant; 04.03.2009
comment
Огромное спасибо за помощь! У меня есть довольно хорошее понимание этого сейчас. Имеет смысл, что только определенные типы приложений считают 4 ядра умеренно необходимыми. - person Josh Stodola; 04.03.2009

Лучший способ начать — скачать последнюю версию CTP фреймворка параллельных расширений и приступить к изучению их примера кода.

person JaredPar    schedule 03.03.2009
comment
Возможно, параллельные расширения немного переборщили. Не стоит ли новичку немного начать с ручной нарезки, чтобы понять все вопросы и изучить основы? - person Srdjan Jovcic; 03.03.2009
comment
Я склонен думать, что обучение через них лучше (поэтому мой ответ искать информацию на .net 4.0). По сути, вы тратите меньше времени на то, как все соединить, и больше времени на то, как параллель влияет на логику. А если нет источника, можно посмотреть с отражателем :) - person eglasius; 03.03.2009

Прочтите о модели асинхронного программирования, которую использует .NET. Изучите парадигму BeginXXX и EnxXXX, которая позволяет делегатам выполняться в пуле потоков.

Все классы Stream имеют методы BeingXXX, EndXXX (например, BeginRead, EndRead), которые позволяют выполнять асинхронный ввод-вывод. Если вы работаете над чем-то, что в значительной степени основано на IO, вы захотите использовать эти методы для увеличения параллелизма.

person Sean    schedule 03.03.2009
comment
Читайте дальше... Я полагаю, у вас есть понимание этих парадигм. У вас есть какой-нибудь материал, чтобы предложить мне начать? СПАСИБО! - person Josh Stodola; 03.03.2009
comment
Взгляните на msdn.microsoft.com/en-us/magazine/cc163467. aspx Все, что написано Джеффри Рихтером на эту тему, хорошо читать. Также поищите статьи Джо Даффи, например msdn.microsoft.com/en. -us/magazine/cc163467.aspx У него также есть хорошая книга по многопоточности. - person Sean; 04.03.2009

Я больше не рекомендую книги очень часто, но Джо Даффи Concurrent Программирование под Windows просто незаменимо.

person Yes - that Jake.    schedule 03.03.2009

Ищите информацию на .net 4.0. Он будет добавлять различные конструкции для него.

person eglasius    schedule 03.03.2009

Как сказал JaredPar, параллельные расширения довольно хороши. Я немного поиграл с ними, и они просты в использовании и повышают производительность.

Мне очень понравились конструкции Parallel.ForEach() и PLinq.

Parallel.ForEach похож на функцию ForEach(делегата), которая есть в коллекциях DotNet 2.0. Он принимает делегат действия и запускает его параллельно.

Plinq позволяет выполнять любой обычный запрос Linq параллельно, добавляя .AsParallel() в конец запроса.

Просмотрите ссылки, размещенные Джаредом, для получения дополнительной информации.

person Sruly    schedule 03.03.2009

Это может стать хорошей отправной точкой.

person Joel Mueller    schedule 03.03.2009

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

person Daniel    schedule 03.03.2009