С помощью следующего кода компилятор генерирует параллельную область, которая выполняется N потоками.
omp_set_num_threads(N);
#pragma omp parallel for
for(int r = 0; r < end_condition; ++r)
{
.. several nested for loops inside ..
}
Каждый поток выполняет подмножество из end_condition. Обратите внимание, что ваша счетная переменная r теперь объявлена внутри параллельной omp для области видимости. Теперь у каждого потока есть своя подсчетная переменная.
Та же цель может быть достигнута с помощью параллельной прагмы, а не параллели для, например:
omp_set_num_threads(N);
#pragma omp parallel private(r)
{
int tid = omp_get_thread_num();
for(r = (end_condition/N) * tid; r < (end_condition/N) * (tid+1) ; ++r)
{
.. several nested for loops inside ..
}
}
конечно, только когда end_condition% N = 0, но вы можете получить сделку. Здесь переменная r явно помечена как приватная для потока и может быть объявлена там, где вы хотите. Компилятор сгенерирует копию для каждого потока.