Как заставить мой код работать на нескольких ядрах? - PullRequest
18 голосов
/ 24 сентября 2008

Я создал приложение на C #, которое я хотел бы оптимизировать для нескольких ядер. У меня есть некоторые темы, я должен сделать больше?

Обновлено для более подробной информации

  • C # 2.0
  • Запуск в Windows Vista и Windows Server 2003

Обновлен снова

  • Этот код работает как служба
  • Я не хочу иметь полный код ... моя цель здесь, чтобы получить ваш опыт и как начать. Как я уже сказал, я уже использую темы. Что еще я могу сделать?

Ответы [ 6 ]

46 голосов
/ 24 сентября 2008

Я бы обобщил, что написание высокооптимизированного многопоточного процесса намного сложнее, чем просто создание нескольких потоков в миксе.

Я рекомендую начать со следующих шагов:

  1. Разделите ваши рабочие нагрузки на отдельные параллельные исполняемые модули
  2. Измерение и характеристика типов рабочих нагрузок - интенсивная работа в сети, интенсивная работа ввода-вывода, загрузка ЦП и т. Д. - они становятся основой для ваших стратегий объединения рабочих. например у вас могут быть довольно большие пулы рабочих для приложений, интенсивно использующих сеть, но не имеет смысла иметь больше работников, чем аппаратных потоков для задач, интенсивно использующих процессор.
  3. Подумайте об организации очереди / массива или ThreadWorkerPool для управления пулами потоков. Бывший более мелкозернистый, чем последний.
  4. Научитесь предпочитать шаблоны асинхронного ввода-вывода по сравнению с шаблонами синхронизации, если можете - освобождает больше процессорного времени для выполнения других задач.
  5. Работа по устранению или, по крайней мере, сокращению сериализации вокруг конфликтующих ресурсов, таких как диск.
  6. Минимизируйте ввод / вывод, приобретайте и удерживайте минимальный уровень блокировок в течение минимально возможного периода. (Блокировка чтения / записи - ваш друг)
    5. Просмотрите этот код, чтобы убедиться, что ресурсы заблокированы в последовательной последовательности, чтобы минимизировать смертельные объятия.
  7. Тестируйте как сумасшедшие - условия гонки и ошибки в многопоточных приложениях - адский способ устранения неполадок - часто вы видите только судебные следствия резни.

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

8 голосов
/ 24 сентября 2008

Возможно, вы захотите прочитать колонку Херба Саттера «Эффективный параллелизм». Вы найдете эти статьи здесь , с другими.

8 голосов
/ 24 сентября 2008

Возможно, вы захотите взглянуть на параллельные расширения для .NET

http://msdn.com/concurrency

6 голосов
/ 24 сентября 2008

Чтобы иметь возможность более эффективно использовать несколько ядер, вы должны разделить свою работу на части, которые могут выполняться параллельно, и использовать потоки для разделения работы на ядра. Вы можете использовать потоки, фоновые рабочие, пулы потоков и т. Д.

5 голосов
/ 24 сентября 2008

Для C # начните изучать LINQ-способ выполнения задач, затем используйте библиотеку Parallel LINQ и ее расширение .AsParallel ().

2 голосов
/ 24 сентября 2008

Понимание параллелизма (или потенциала параллелизма) в задачах, которые вы пытаетесь решить, ваше приложение и его алгоритмы гораздо важнее, чем какие-либо детали синхронизации потоков, библиотек и т. Д.

Начните с чтения Шаблоны для параллельного программирования (который фокусируется на «обнаружении параллелизма» и проблемах проектирования более высокого уровня), а затем перейдите к Искусство многопроцессорного программирования (практично детали, начиная с теоретической основы).

...