Я следующее рекурсивную функцию (ПРИМЕЧАНИЕ: лишен всех незначительных деталей)Лучший способ распараллелить рекурсии с использованием OpenMP
int recursion(...) {
int minimum = INFINITY;
for(int i=0; i<C; i++) {
int foo = recursion(...);
if (foo < minimum) {
minimum = foo;
}
}
return minimum;
}
Примечание 2: Это конечное, но не в этом упрощенном примере, поэтому, пожалуйста, проигнорируйте это. Целью этого вопроса является правильное рассмотрение этой проблемы.
Я думал об использовании задач, но я не уверен, как правильно его использовать - как парализовать внутренний цикл.
EDIT 1: Дерево рекурсии плохо сбалансировано. Он используется с динамическим подходом к программированию, поэтому со временем многие значения повторно используются с предыдущих проходов. Меня это очень беспокоит, и я думаю, что это будет большим узким местом.
C находится где-то около 20.
Метрики для лучшего является самым быстрым :)
Он будет работать на 2х Xeon, так что есть много HW власти Availible.
Возможно, это помогает: http://stackoverflow.com/questions/17002380/fibonacci-numbers-with-openmp-tasks – pokey909
1) Насколько сбалансировано ваше рабочее/рекурсивное дерево? Насколько велика 'C' 2) Каков ваш показатель для« лучшего »? 3) В каком масштабе системы вы предполагаете, что это нужно запустить? – Zulan