Показаны сообщения с ярлыком Parallel Computing. Показать все сообщения
Показаны сообщения с ярлыком Parallel Computing. Показать все сообщения

среда, 26 мая 2010 г.

ConcurrentBag and BlockingCollection

В .NET 4.0 появился ряд новых классов для многопоточных приложений, в частности BlockingCollection и несколько Concurrent коллекций, к примеру, ConcurrentQueue и ConcurrentBag.

BlockingCollection удобно использовать для построения пайплайна обработки данных:
static void ProcessFile(string inputPath, string outputPath)
{
  var inputLines = new BlockingCollection<string>();
  var processedLines = new BlockingCollection<string>();

  // Stage #1
  var readLines = Task.Factory.StartNew(() =>
  {
    try
    {
      foreach (var line in File.ReadLines(inputPath)) inputLines.Add(line);
    }
    finally { inputLines.CompleteAdding(); }
  });

  // Stage #2
  var processLines = Task.Factory.StartNew(() =>
  {
    try
    {
      foreach(var line in inputLines.GetConsumingEnumerable()
.Select(line => Regex.Replace(line, @"\s+", ", ")))
      {
        processedLines.Add(line);
      }
    }
    finally { processedLines.CompleteAdding(); }
  });

  // Stage #3
  var writeLines = Task.Factory.StartNew(() =>
  {
    File.WriteAllLines(outputPath, processedLines.GetConsumingEnumerable());
  });

  Task.WaitAll(readLines, processLines, writeLines);
}

Однако, BlockingCollection - это обертка над интерфейсом IProducerConsumerCollection, коий реализуют выше указанные Concurrent коллекции. Так вот мы активно используем BlockingCollection. И недавно выяснилось, что по умолчанию BlockingCollection использует ConcurrentQueue, то есть поддерживает порядок обработки данных. Что зачастую нам не требуется. ConcurrentBag же не поддерживает порядок, но, как вы уже догадались, работает быстрее.

В целом же разница исчисляется во многих разах:

For mixed producer-consumer scenarios that do not require item ordering, ConcurrentBag(T) can be dramatically more efficient than ConcurrentStack(T) , ConcurrentQueue(T), and other synchronized collections.

Подробнее со статистикой здесь:
Thread-safe Collections in .NET Framework 4 and Their Performance Characteristics

воскресенье, 23 мая 2010 г.

Parallel Computing in MS

Слышали про новую фичу Excel 2010? Обработка таблиц на HPC Server 2008 R2 кластере. Это не шутка, фича позиционируется как серьезное улучшение в 2010 экселе. Это значит, что есть пользователи, у которых в Excel зашито столько логики, что им действительно имеет смысл просчитывать таблицы на кластере. А вы все со своими дотнетами бегаете.

Вообще, HPC Server 2008 R2 - это еще один шаг от Microsoft в стороную параллельных/распределенных вычислений. Он используется не только для обработки экселевских таблиц :) Краткий список возможностоей - собственно HPC кластер для распределенных вычислений (на основе MPI, насколько я понимаю), поддержка HPC Server в VS2010, возможность использовать в том числе и Linux машины в кластере, возможность использовать spare processing cycles компьютеров под Windows 7 в сети (grid computing), поддержка GPGPU. Тем, кто хочет знать больше, - сюда, первые несколько постов содержат дорожную карту по HPC и MPI.

Интересно еще будет почитать про усилия Microsoft в сфере GPGPU...