В моем проекте структура данных представлена следующим образом:
type 'a Tree =
| Leaf of 'a
| Node of 'a Tree array
Из-за стоимости обхода больших деревьев я должен распараллелить некоторые следующие функции в этой структуре данных:
- карта
- * 1009 раза *
- существует (существует узел, удовлетворяющий
сказуемое)
- уменьшить / преобразовать (необязательно)
Из-за характера проблемы, над которой я работаю, количество ветвей на каждом узле варьируется, а рабочие нагрузки на уровне листьев довольно малы. Первый вопрос: какие варианты следует рассмотреть для параллельного выполнения на дереве. Я пытаюсь использовать функции из модуля Array.Parallel
на каждом узле, однако, поскольку накладные расходы параллелизма слишком велики, параллельная версия даже медленнее, чем последовательная версия. Я могу изменить представление массива на List
или PSeq
, если это необходимо.
Второй вопрос - как контролировать степень параллелизма в этих функциях. Я думаю об управлении по глубине дерева, количеству ветвей в каждом узле, сложности рабочей нагрузки на уровне листьев и количестве листья на дереве, однако, объединяя их вместе, кажется сложным и непредсказуемым.