После выглядящего Fork/Join Tutorial, я создал класс для вычисления больших факториалов:Как определить правильный порог работы деления вилки присоединиться задачами
public class ForkFactorial extends RecursiveTask<BigInteger> {
final int end;
final int start;
private static final int THRESHOLD = 10;
public ForkFactorial(int n) {
this(1, n + 1);
}
private ForkFactorial(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected BigInteger compute() {
if (end - start < THRESHOLD) {
return computeDirectly();
} else {
int mid = (start + end)/2;
ForkFactorial lower = new ForkFactorial(start, mid);
lower.fork();
ForkFactorial upper = new ForkFactorial(mid, end);
BigInteger upperVal = upper.compute();
return lower.join().multiply(upperVal);
}
}
private BigInteger computeDirectly() {
BigInteger val = BigInteger.ONE;
BigInteger mult = BigInteger.valueOf(start);
for (int iter = start; iter < end; iter++, mult = mult.add(BigInteger.ONE)) {
val = val.multiply(mult);
}
return val;
}
}
У меня есть вопрос, как определить порог, для которого Я разделяю задачу? Я нашел page on fork/join parallelism, который гласит:
Одна из основных вещей, которые необходимо учитывать при реализации алгоритма с помощью вилки/нарисуй параллелизм они выбрали порог, который определяет будет ли задача выполнить последовательное вычисление, а не разветвление параллельно подзадачи.
Если порог слишком велик, программа может не создавать достаточное количество заданий, чтобы в полной мере воспользоваться преимуществами доступных процессоров/ядер .
Если порог слишком мал, тогда накладные расходы на создание задачи и управление могут стать значительными.
В целом, некоторые эксперименты будут необходимы для определения соответствующего порогового значения .
Итак, какие эксперименты мне нужно будет сделать, чтобы определить порог?
Мне интересно, что вы достигли в своем расследовании. См. Http://stackoverflow.com/questions/22191369/fork-join-optimization, пожалуйста. Можете ли вы поделиться со мной результатами? –