Рекомендации по запуску большого проекта многопоточного программирования - PullRequest
11 голосов
/ 14 декабря 2009

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

У нас есть коробка с 24 процессами, чтобы запустить это. У меня будет доступ к исходной программе (написанной на C ++, я думаю), но на данный момент я очень мало знаю о ее разработке.

Мне нужен совет, как справиться с этим. Я опытный программист (~ 30 лет, в настоящее время работаю в C # 3.5), но не имею опыта работы с несколькими процессорами / многопоточностью. Я желаю и хочу выучить новый язык, если это уместно. Я ищу рекомендации по языкам, учебным ресурсам, книгам, архитектурным руководствам. и т.д.

Требования: ОС Windows. Компилятор коммерческого класса с большой поддержкой и хорошими учебными ресурсами. Нет необходимости в необычном графическом интерфейсе - он, вероятно, будет запускаться из файла конфигурации и помещать результаты в базу данных SQL Server.

Edit: текущее приложение на C ++, но я почти наверняка не буду использовать этот язык для переписывания. Я удалил тег C ++, который кто-то добавил.

Ответы [ 16 ]

1 голос
/ 14 декабря 2009

Я бы подумал сделать это в .NET 4.0, поскольку в нем много новой поддержки, специально предназначенной для облегчения написания параллельного кода. Официальная дата его релиза - 22 марта 2010 года, но, вероятно, он выйдет до RTM, и теперь вы можете начать с достаточно стабильной бета-версии 2.

Вы можете использовать C #, с которым вы более знакомы, или использовать управляемый C ++.

На высоком уровне попытайтесь разбить программу на System.Threading.Tasks.Task , которые являются отдельными единицами работы. Кроме того, я бы минимизировал использование общего состояния и рассмотрел возможность использования Parallel.For (или ForEach ) и / или PLINQ , где это возможно.

Если вы сделаете это, большая часть тяжелой работы будет выполнена для вас очень эффективным способом. Это направление, которое Microsoft будет все активнее поддерживать.

2 : я бы подумал сделать это в .NET 4.0, поскольку в нем много новой поддержки, специально предназначенной для облегчения написания параллельного кода. Официальная дата его релиза - 22 марта 2010 года, но, вероятно, он будет RTM раньше, и вы можете начать с достаточно стабильной бета-версии 2 сейчас. На высоком уровне попробуйте разбить программу на System.Threading.Tasks.Task , которые являются отдельными единицами работы. Кроме того, я бы минимизировал использование общего состояния и рассмотрел возможность использования Parallel.For и / или PLINQ, где это возможно. Если вы сделаете это, много тяжелой работы будет сделано для вас очень эффективным способом. 1 : http://msdn.microsoft.com/en-us/library/dd321424%28VS.100%29.aspx

1 голос
/ 14 декабря 2009

Большинство других ответов дают хороший совет относительно разбиения проекта на части - ищите задачи, которые могут быть аккуратно выполнены параллельно с минимальным совместным использованием данных. Помните о не поточно-безопасных конструкциях, таких как статические или глобальные переменные, или библиотеках, которые не являются поточно-ориентированными. Худший случай, с которым мы столкнулись, - это библиотека TNT , которая даже при некоторых обстоятельствах даже не допускает поточно-ориентированное чтение.

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

Вам понадобится хорошее понимание различных потоковых примитивов (мьютексов, семафоров, критических секций, условий и т. Д.) И ситуаций, в которых они полезны.

Одна вещь, которую я бы добавил, если вы намереваетесь остаться с C ++, это то, что мы добились большого успеха, используя библиотеку boost .thread. Он предоставляет большинство необходимых многопоточных примитивов, хотя и не имеет пула потоков (и я бы опасался неофициального пула потоков «boost», который можно найти через google, потому что он страдает рядом проблем взаимоблокировки). *

0 голосов
/ 15 декабря 2009

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

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

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

0 голосов
/ 14 декабря 2009

Какую бы технологию вы ни собирались написать, посмотрите , в которой должна быть прочитана книга по параллелизму "Параллельное программирование в Java" , а для .Net я настоятельно рекомендую библиотеку retlang для одновременное приложение.

0 голосов
/ 14 декабря 2009

Вы пометили этот вопрос как C ++, но упомянули, что в настоящее время вы являетесь разработчиком C #, поэтому я не уверен, что вы будете выполнять это задание из C ++ или C #. В любом случае, если вы собираетесь использовать C # или .NET (включая C ++ / CLI): у меня есть закладка для следующей статьи MSDN, и я настоятельно рекомендую прочитать ее как часть вашей подготовительной работы.

Асинхронный вызов синхронных методов

0 голосов
/ 14 декабря 2009

Если возможно, чтобы все потоки работали с непересекающимися наборами данных процесса, а другая информация сохранялась в базе данных SQL, вы можете легко сделать это в C ++ и просто создавать новые потоки для работы над своими частями используя Windows API. SQL-сервер справится со всей магией жесткой синхронизации своими транзакциями с БД! И, конечно, C ++ будет работать намного быстрее, чем C #.

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

...