Как скомпилировать C # для многопроцессорных машин?(С VS 2010 или csc.exe) - PullRequest
3 голосов
/ 07 марта 2011

Привет!

Я искал опции компилятора (csc.exe) в MSDN и нашел ответ здесь, в Stackoverflow, о компиляции с несколько процессоров .Но моя проблема заключается в компиляции для нескольких процессоров, как показано ниже.

В университете, где я заканчиваю обучение, есть кластер из 11 машин (который имеет 6 четырехъядерных и 5 четырехъядерных компьютеров).машины).Он работает под Linux, но я могу установить MONO там.И вместо компиляции с несколькими процессорами или ядрами, я хочу скомпилировать для машины с несколькими процессорами.Итак:

  • Есть ли какая-то конкретная деталь о том, как это сделать, или CLR в этой системе должен обрабатывать выполнение, чтобы распределить его по ядрам?
  • Если есть способ сделатьэто, как я могу сделать это с VS2010 или с помощью компилятора командной строки csc.exe?

Заранее спасибо, и я извиняюсь, если этот вопрос не имеет смысла.Я действительно не знаю, как работать с несколькими ядрами, потому что я простой физик, а не ученый! :)

Ответы [ 5 ]

11 голосов
/ 07 марта 2011

Вам не нужно компилировать по-разному, чтобы учесть несколько ядер.Вам нужно по-другому написать код , чтобы использовать несколько потоков.Если вы можете использовать классы из .NET 4 в своей среде (последняя версия Mono должна поддерживать это), вы можете использовать Task Parallel Library, которая немного облегчает эту задачу.

По сути, вы не получаете параллелизм длябесплатно - вам нужно подумать о том, какие биты вашего кода могут работать параллельно.Возможно, вы захотите прочитать вывод группы Patterns and Practices для параллельного программирования .(Книга является очень хорошей отправной точкой.)

7 голосов
/ 07 марта 2011

Ваше предположение верно;Ваш вопрос не имеет смысла.

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

Вы можете явно использовать несколько ядер в C #, используя классы Thread или ThreadPool, или используя Parallel LINQ или TPL.специальный компилятор не задействован.

2 голосов
/ 07 марта 2011

CLR по умолчанию не будет делать ничего особенного, чтобы распределить работу по нескольким ядрам. ВЫ, при разработке приложения, несете ответственность за наилучшее использование ресурсов вашей машины. .NET Framework имеет несколько библиотек и технологий, которые упрощают реализацию многопоточных операций: ищите класс Thread, Delegate.BeginInvoke / EndInvoke и библиотеку параллельных задач.

1 голос
/ 07 марта 2011

Ответ на ваш вопрос приходит в виде двух, казалось бы, противоречивых утверждений:

1: Это уже делает

и

2: Вы не можете

Современные операционные системы и, следовательно, среды разработки используют потоки.Поток, по сути, представляет собой одну последовательность последовательных шагов (и слов, которые не начинаются с "S"), которые будет выполнять процессор.Эти потоки управляются операционной системой и архитектурой процессора, где процессор выполнит некоторую часть (или весь) потока, сохранит его состояние, а затем переключится на другой поток.

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

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

Проще говоря, чтобыесли ваш код использует преимущества нескольких ядер или процессоров, вы должны разбить свою работу на небольшие, предпочтительно атомарные части кода.Конкретный метод, который вы используете для разбиения вашего кода на несколько потоков, может отличаться;использование System.Threading.ThreadPool или более поздней библиотеки параллельных задач может упростить некоторые из этих вещей, хотя всегда есть компромисс (как и со всем) в эффективности или контроле.

Если вдаваться в подробности, чем этоТребуется посмотреть на ваш фактический код.Вам лучше найти кого-то с опытом написания надежного, производительного многопоточного кода (если это возможно, кто-то с недавним .NET опытом в этом, поскольку это поможет определить, какие библиотеки будут подходящими). ​​

1 голос
/ 07 марта 2011

Поскольку это кластер, вы должны полагаться на некоторую форму параллелизма передачи сообщений, никакой компилятор не преобразует ваш код автоматически. По крайней мере, поддерживается старый добрый MPI: http://osl.iu.edu/research/mpi.net/

...