Параллельные вычисления в Microsoft Visual C# (NET Framework 3.5)
На сегодняшний день развитие индустрии компьютеростроения идет широкими шагами. Растут объемы оперативной памяти, частоты работы процессоров, количество процессоров и их ядер. Не секрет, что даже самый маленький процессор сегодняшнего дня производительностью превосходит процессоры для серверных платформ дня вчерашнего. Но зачастую гигагерцы процессоров и гигабайты оперативной памяти сводятся на нет невозможностью современного софта использовать аппаратные ресурсы на 100%.
Это понимают и производители программного обеспечения и производители «Железа», стремясь разработать технологию позволяющую «нагрузить» компьютер по «полной». Сегодня мы рассмотрим одно из таких решений.
1) Библиотека Parallel Extensions to .NET Framework 3.5 от фирмы Microsoft corp. (Подробнее о ней можно почитать в MSDN выпуск - October 2007).
Итак, для экспериментов нам понадобятся: (Ссылки на программы даны в конце статьи)
1) Microsoft Windows XP или Vista…
2) Microsoft .NET Framework 3.5 (Входит в комплект поставки Visual Studio 2008/2008 Express Edition)
3) Visual Studio 2008 Express Edition.
4) Библиотека Parallel Extensions to .NET Framework 3.5.
Parallel Extensions to .NET Framework 3.5
Скачиваем и устанавливаем библиотеку Parallel Extensions to .NET Framework 3.5. Запускаем Visual Studio и создаем консольный проект на C# for .NET. Щелкаем на вкладке References нашего проекта и выбираем Add Reference. Далее во вкладке Browse находим библиотеку System.Threading.dll (По-умолчанию -> c:\Program Files\Microsoft Parallel Extensions Dec07 CTP\). В редакторе кода дописываем:
Код:
using System.Threading;
using System.Runtime.InteropServices;
Теперь наш проект готов для работы на нескольких ядрах. Осталось применить что-нибудь этакое для наглядности. Для начала удостоверимся, что ядер действительно несколько:
Код:
if (System.Environment.ProcessorCount < 2)
{
Console.WriteLine("You not have Multi-Core platform\n");
}
Выведем меню, будем грузить 1 ядро и потом 2…
Код:
Console.WriteLine("If you want test Single-Core platform press 1");
Console.WriteLine("If you want test Mullti-Core platform press 2");
r = Console.ReadLine();
Поможет нам старый добрый switch. Сначала грузим 1 ядро:
Код:
switch(r)
{
case "1":
for (int i = 0; i < 100000; i++)
{
Console.WriteLine("{0} > {1}", Math.Pow(i, 2.0).ToString(),
Math.Pow(i, -2.0).ToString());
}
break;
Откройте «Диспетчер задач» и посмотрите наглядно, как загружено 1 ядро…
А теперь распараллелим вычисления:
Код:
case "2":
System.Threading.Parallel.For(0, 100000, delegate(int i)
{
Console.WriteLine("{0} <-> {1}",
Math.Pow(i, 2.0).ToString(), Math.Pow(i, -2.0).ToString());
});
break;
default:
{
Console.WriteLine("Error number");
break;
}
Откройте «Диспетчер задач» и посмотрите наглядно, как загружен процессор сейчас!
Вот мы с вами и научились писать распределенные приложения, балансируя нагрузку на CPU компьютера с помощью Parallel Extensions to .NET Framework 3.5.
В следующей статье мы рассмотрим, написание многопоточных приложений без использования .NET Framework с помощью библиотеки Intel® TBB (Threading Building Blocks) – кроссплатформенная библиотека для параллельных вычислений от фирмы Intel.
Parallel Extensions to .NET Framework 3.5