Невозможно установить фиксированное количество потоков для рекурсивной функции с двумя ветвями с использованием OpenMP - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь распараллелить с 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);
      }
    }
  }
}

Но что бы я ни пытался, потоки будут создаваться динамически и приведут к вышеупомянутой ошибке, или будут созданы только два потока, и каждая рекурсия будет использовать эти два потока.

Буду признателен, если кто-нибудь укажет мне правильное направление.

...