Использование распараллеливания для относительно больших циклов - PullRequest
1 голос
/ 16 октября 2010

У меня 8-ядерный процессор с 8 ГБ памяти. Логически следующий код может быть выполнен параллельно, но поскольку цикл предоставляет более чем достаточно возможностей для параллелизма, поскольку у меня гораздо меньше доступных ядер, чем размер цикла. Во-вторых, каждое выражение делегата выделяет некоторую память для хранения свободных переменных. В этом случае рекомендуется использовать параллель для?

также будет разделять 2 параллельные задачи на 2, чтобы повысить производительность в этом случае ??

     private static void DoWork()
    {

        int end1 = 100; // minimum of 100 values; 
        int end2 = 100; // minimum of 100 values;


        Task a = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end1, delegate(int i)
                {
                    // independent work                     
                });
            }
        );

        Task b = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end2, delegate(int i)
                {
                    // independent work                        
                });
            }
        );

        a.Wait();
        b.Wait();         
    }

Ответы [ 2 ]

1 голос
/ 16 октября 2010

также будет разделять 2 parralel for's на 2 задачи для повышения производительности в этом случае ??

Незаметно, и вы легко можете повредить производительности.

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

Основные моменты, которые вас интересуют:

  • «работа» действительно должна быть независимой
  • «работа» должна быть нетривиальной, т. Е. Требующей большого объема вычислений и значительно большей, чем просто добавление нескольких чисел
  • «работа» должна избегать ввода / вывода (насколько это возможно)
1 голос
/ 16 октября 2010
  • Оставьте балансировку нагрузки для платформы, вызвав "Partitioner.Create".
  • Попробуйте создать объект ParallelOptions и передайте его Parallel.For. Попробуйте использовать другой метод MaxDegreeOfParallelism и настройте код на основе результатов, это число может быть больше, чем нет. ядер в вашей системе. Это сработало для меня.
...