Распараллеливание базовых расчетов для рекурсии с использованием OpenMP - PullRequest
3 голосов
/ 17 февраля 2011

Я пытаюсь изучить концепции OpenMP и наткнулся на случай, который мне трудно понять, как решить эту библиотеку.

Допустим, у нас есть следующая рекурсивная функция

// ...
void recurse(int tmp[], int p, const int size)
{
   if (p == size)
   {
      // Computationally heavy, should be executed in its own "thread"
      performTask(tmp); // Note: Only requires read access
   }
   else
   {
      for(int i = 0; i < size; i++)
      {
         // Alter tmp and continue recursion
         tmp[p] = i;
         recurse(tmp, p+1, size);
      }
   }
}
// ...
int main(int argc, char * argv[])
{
    int tmp[10];
    recurse(tmp, 0, 10);
    return 0;
}

Как я могу выполнить performTask параллельно при создании новых структур в главном потоке с использованием OpenMP?

Я знаю, что есть нечто, называемое «задачами», и я думаю, что это то, что я должен использовать здесь, но все, что я придумаю, просто не дает никакого увеличения производительности вообще. Пожалуйста, направьте меня в правильном направлении.

Редактировать: Я сделал пример программы более конкретным для лучшего объяснения.

1 Ответ

1 голос
/ 21 февраля 2011

Код ниже не работает, как есть, но, надеюсь, он укажет вам правильное направление:

// ...
void recurse(int tmp[], int p, const int size)
{
   if (p == size)
   {
      // Computationally heavy, should be executed in its own "thread"
      // perform task using the thread pool
#pragma omp task     
      performTask(tmp); // Note: Only requires read access
   }
   else
   {
      for(int i = 0; i < size; i++)
      {
         // Alter tmp and continue recursion
         tmp[p] = i;
         recurse(tmp, p+1, size);
      }
   }
}
// ...
int main(int argc, char * argv[])
{    
    int tmp[10];
    // start threads
#pragma omp parallel
{
    // use single thread to construct `tmp` values
#pragma omp single nowait
    recurse(tmp, 0, 10);
}
    return 0;
}

Код основан на Сравнение вложенных параллельных областей и задач в OpenMP 3.0.

...