Распараллеливание OpenMP на рекурсивной функции

Похоже, что это работает так, как задумано для этого поста с 2016 года - https://forums.aws.amazon.com/thread.jspa?messageID=702896򫦰

6
задан Community 23 May 2017 в 12:31
поделиться

4 ответа

Вот модифицированный фрагмент псевдокода, который должен работать.

populatearray(thescene)
{
  recursivepopulatearray(thescene)

  #pragma omp parallel for
  for each element in array
    populate array element based on associated object
}

recursivepopulatearray(theobject)
{
  for each childobject in theobject
  {
     assign array index and associate element with childobject
     recursivepopulatearray(childobject)
  }
}
0
ответ дан 17 December 2019 в 20:34
поделиться

I think you should clarify better your question (e.g. what exactly must be done serially and why)

OpenMP (like many other parallelization libraries) does not guarantee the order in which the various parallel sections will be executed, and since they are truly parallel (on a multicore machine) there might be race conditions if different sections write the same data. If that's ok for your problem, surely you can use it.

1
ответ дан 17 December 2019 в 20:34
поделиться

to parallelise the child thread, simply put a pragma before the loop:

#pragma omp parallel for
for (i=0; i < elements; i++) 
{
}

Job done.

Now, you're quite right you cannot get any threading library to do one bit before another in a fully parallel way (obviously!), and openMP doesn't have a 'lock' or 'wait' feature (it does have a 'wait for all to finish' keyword - Barrier), its not designed to emulate a thread library, but it does allow you to store values "outside" the parallel section, and to mark certain sections as 'single threaded only' (Ordered keyword) so this may help you to assign the indexes in a parallel loop while other threads are assigning elements.

Take a look at a getting started guide.

If you're using Visual C++, you'll also need to set the /omp flag in your compiler build settings.

0
ответ дан 17 December 2019 в 20:34
поделиться

Как gbjbaanb упомянул , вы можете сделать это легко - для распараллеливания требуется просто инструкция прагмы.

Однако есть несколько вещей, на которые следует обратить внимание. :

Во-первых, вы упомянули, что порядок здесь имеет решающее значение. Если вам нужно сохранить порядок при выравнивании иерархической структуры, распараллеливание (на этом уровне) будет проблематичным. Скорее всего, вы полностью потеряете порядок.

Кроме того, распараллеливание рекурсивных функций имеет много проблем. Возьмем крайний случай - скажем, у вас есть двухъядерный компьютер и у вас есть дерево, в котором каждый «родительский» узел имеет 4 дочерних узла. Если дерево глубокое, вы очень, очень быстро «чрезмерно распараллеливаете» проблему, что обычно ухудшает, а не улучшает производительность.

Если вы собираетесь это сделать, вам, вероятно, следует указать параметр уровня и распараллелить только первые пару уровней. Возьмите мой пример с четырьмя дочерними элементами на одного родителя, если вы распараллеливаете первые 2 уровня, вы уже разбиваете его на 16 параллельных фрагментов (вызываемых из 4 параллельных фрагментов).

Из того, что вы упомянули, я бы оставил эту часть последовательной , и сфокусируйтесь вместо второго, где вы упоминаете:

«Затем он проходит этот массив несколько раз, чтобы рисовать объекты / наложения и т. д.»

Звучит как идеальное место для распараллеливания.

1
ответ дан 17 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: