MaxDegreeOfParallelism для Array.Parallel? - PullRequest
3 голосов
/ 07 мая 2010

Возможно ли установить 'MaxDegreeOfParallelism' (то есть максимальное количество потоков для использования) для модуля Array.Parallel, поскольку под капотом он использует Parallel.For?

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Согласно этому посту , похоже, что в окончательной версии Parallel Extensions нет способа ограничить количество потоков глобально. Альтернативой тому, что предлагает Брайан, было бы использование PLINQ (который работает с параллельными последовательностями) вместо функций, которые работают с массивами.

Это можно сделать с помощью модуля PSeq из F # PowerPack . Он предоставляет такие функции, как PSeq.map, PSeq.filter и многие другие, которые работают с параллельными последовательностями (которые также могут быть красиво составлены с использованием конвейерной обработки). Для параллельных последовательностей можно использовать метод расширения WithDegreeOfParallelism , чтобы указать поведение.

Вы можете реализовать для него функцию-обертку:
[РЕДАКТИРОВАТЬ: Это уже там!]

let withDegreeOfParallelism n (pq:ParallelQuery<_>) = 
  pq.WithDegreeOfParallelsm(n)

А потом напишите:

let res = 
  data |> PSeq.map (fun n -> ...)
       |> PSeq.withDegreeOfParallelism ParallelOptions.MaxDegreeOfParallelism
       |> Array.ofSeq

Это может иметь разные характеристики, потому что оно реализовано не так, как функции в модуле Array.Parallel, но это, безусловно, зависит от вашего сценария.

1 голос
/ 07 мая 2010

Нет, я так не думаю.

Вы всегда можете создать свои собственные версии любого из методов в модуле Array.Parallel , используя исходный код array.fs CTP-выпуске ) в качестве стартер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...