У меня есть параллельный блок, который порождает определенное количество потоков.Затем все эти потоки должны запустить «общий» цикл for, который содержит несколько параллельных циклов for.Например, что-то вроде этого:
// 1. The parallel region spawns a number of threads.
#pragma omp parallel
{
// 2. Each thread does something before it enters the loop below.
doSomethingOnEachThreadAsPreparation();
// 3. This loop should run by all threads synchronously; i belongs
// to all threads simultaneously
// Basically there is only one variable i. When all threads reach this
// loop i at first is set to zero.
for (int i = 0; i < 100; i++)
{
// 4. Then each thread calls this function (this happens in parallel)
doSomethingOnEachThreadAtTheStartOfEachIteration();
// 5. Then all threads work on this for loop in parallel
#pragma omp for
for (int k = 0; i < 100000000; k++)
doSomethingVeryTimeConsumingInParallel(k);
// 6. After the parallel for loop there is (always) an implicit barrier
// 7. When all threads finished the for loop they call this method in parallel.
doSomethingOnEachThreadAfterEachIteration();
// 8. Here should be another barrier. Once every thread has finished
// the call above, they jump back to the top of the for loop,
// where i is set to i + 1. If the condition for the loop
// holds, continue at 4., otherwise go to 9.
}
// 9. When the "non-parallel" loop has finished each thread continues.
doSomethingMoreOnEachThread();
}
Я думал, что уже возможно реализовать этот тип поведения, используя #pragma omp single
и общую переменную i
, но я больше не уверен в этом.
То, что на самом деле делают функции, не имеет значения;это о потоке управления.Я добавил комментарии о том, как я хочу это будет.Если я правильно понимаю, цикл в 3.
обычно создает переменную i
для каждого потока, а глава цикла обычно не выполняется только одним потоком.Но это то, что я хочу для этого случая.