Поскольку многоядерные процессоры становятся все более и более популярными, я думаю, что было бы разумно ознакомиться с тем, как писать код, чтобы использовать их преимущества. Я разработчик .NET и не знаю, с чего начать (серьезно, я не знаю, с чего начать). Какие-либо предложения?
Как писать приложения .NET, использующие многоядерные процессоры
Ответы (8)
Многоядерное программирование — это, по сути, многопоточное программирование. Пока ваше приложение является многопоточным, операционная система будет определять, на каком ядре какой поток выполнять.
Итак, ваш реальный вопрос должен заключаться в том, какие приложения выиграют от многопоточности? Подумайте о таком приложении, а затем создайте несколько потоков для решения равных частей проблемы.
Лучший способ начать — скачать последнюю версию CTP фреймворка параллельных расширений и приступить к изучению их примера кода.
- Страница параллельной группы: http://msdn.microsoft.com/en-us/concurrency/default.aspx
- Последнее объявление CTP: http://blogs.msdn.com/somasegar/archive/2008/06/02/june-2008-ctp-parallel-extensions-to-the-net-fx.aspx
Прочтите о модели асинхронного программирования, которую использует .NET. Изучите парадигму BeginXXX и EnxXXX, которая позволяет делегатам выполняться в пуле потоков.
Все классы Stream имеют методы BeingXXX, EndXXX (например, BeginRead, EndRead), которые позволяют выполнять асинхронный ввод-вывод. Если вы работаете над чем-то, что в значительной степени основано на IO, вы захотите использовать эти методы для увеличения параллелизма.
Я больше не рекомендую книги очень часто, но Джо Даффи Concurrent Программирование под Windows просто незаменимо.
Ищите информацию на .net 4.0. Он будет добавлять различные конструкции для него.
Как сказал JaredPar, параллельные расширения довольно хороши. Я немного поиграл с ними, и они просты в использовании и повышают производительность.
Мне очень понравились конструкции Parallel.ForEach() и PLinq.
Parallel.ForEach похож на функцию ForEach(делегата), которая есть в коллекциях DotNet 2.0. Он принимает делегат действия и запускает его параллельно.
Plinq позволяет выполнять любой обычный запрос Linq параллельно, добавляя .AsParallel() в конец запроса.
Просмотрите ссылки, размещенные Джаредом, для получения дополнительной информации.
Простое разделение вашего проекта на различные потоки, специализированные для выполнения определенной функции, позволит вам использовать преимущества нескольких ядер. ОС обрабатывает планирование различных потоков для наиболее доступного ядра процессора.