Я пытаюсь распараллелить с OpenMP рекурсивную функцию с этой формой:
void RecursiveFunction(double *array, int size)
{
if(n > 1)
{
//Serial code
//0 < index < n
RecursiveFunction(array, index);
RecursiveFunction(array, n - index-1);
}
}
int main()
{
//Serial code
RecursiveFunction(array, size);
//Serial code
}
Компилятор (gcc) выдает ошибку, когда создается более определенного количества потоков (между 800 и 900), заявляя, что "libgomp: Создание потока не удалось: Ресурс временно недоступен". Поэтому я пытаюсь установить фиксированное количество потоков, используя omp_set_num_threads (fixedThreadNumber), чтобы при повторном создании более максимального числа потоков система ожидала освобождения потока, чтобы создать другой рекурсии.
Помимо установки максимального числа потоков с помощью omp_set_num_threads, я также попытался установить для omp_set_dynamic значение 0, для omp_set_nested значение 1 и изменить рекурсивную функцию в такой форме:
int main()
{
//Serial code
omp_set_num_threads(numberOfThreads);
omp_set_dynamic(0);
omp_set_nested(1);
RecursiveFunction(array, size);
//Serial code
}
void RecursiveFunction(double *array, int size)
{
if(n > 1)
{
//Serial code
//0 < index < n
#pragma omp parallel sections
{
#pragma omp section
{
RecursiveFunction(array, index);
}
#pragma omp section
{
RecursiveFunction(array, n-index-1);
}
}
}
}
Но что бы я ни пытался, потоки будут создаваться динамически и приведут к вышеупомянутой ошибке, или будут созданы только два потока, и каждая рекурсия будет использовать эти два потока.
Буду признателен, если кто-нибудь укажет мне правильное направление.