1

Я создаю настраиваемый плагин для Unity GameEngine, который поддерживает .NET 3.5. И чтобы иметь возможность использовать TPL, я установил Reactive Extensions v1.0.2856.0 (я думаю, это последний, который включает в себя TPL). Итак, в скрипте у меня есть цикл с примерно 65000 взаимодействий. Например, у меня нет проблем с использованием цикла Parallel.Foreach, но проблема в том, что с помощью разделителя по умолчанию работа распределяется неравномерно из-за небольшого количества итераций, и на самом деле цикл становится немного медленнее.Использование Paraller.Foreach с разделителем в .NET 3.5

Так что мои вопросы таковы: Есть ли способ создать разделитель, который дает моим 2 ядрам процессора около половины итераций для работы.

ответ

0

Использование ParallelOptions.MaxDegreeOfParallelism:

var options = new ParallelOptions {MaxDegreeOfParallelism = 2}; 
Parallel.ForEach(list, options, 
    item => 
    { 
     // work}) 
    }); 
+0

, что на самом деле помогает немного, работа распределяется намного лучше, как 2/3 для 1-го ядра и 1/3 для второго ядра и есть небольшое повышение производительности примерно + 5% ... есть что-то еще, что я мог бы попытаться увеличить цикл? что-то с разделителями, как описано здесь http://msdn.microsoft.com/en-us/library/dd560853(v=vs.100).aspx, поскольку я понимаю, что есть разница в сборке System.Collections.Concurrent в 4.0 и 3.5 –

+0

Параллельно по умолчанию уже выполняется довольно хорошая работа по распределению работы между ядрами. Может быть, некоторые из ваших предметов занимают больше времени, чем другие? –

+0

Цикл представляет собой тестирование пересечения лучей и треугольников, и каждая итерация должна иметь одинаковую стоимость. Может быть, проблема в том, что даже 65000 итераций мало для параллельного цикла. Он заканчивается в 0.01 миллисекундах основного потока и, вероятно, стоимость создания нового потока большой. Я просто пытаюсь угадать, читая документы в MSDN. –

Смежные вопросы