Кажется, я не совсем понимаю поведение параллельных конструкций openmp с вложенными циклами for.Рассмотрим следующий код:
std::size_t idx;
std::size_t idx2;
omp_set_num_threads( 2 );
#pragma omp parallel default(shared) private(idx, idx2)
{
for(std::size_t idx=0;idx<3;idx++)
{
for(std::size_t idx2=0;idx2<4;idx2++)
{
LOG("From thread "+std::to_string(omp_get_thread_num())+" idx "+std::to_string(idx)+" idx2 "+std::to_string(idx2));
}
}
}
Это приводит к следующему выводу:
From thread 0 idx 0 idx2 0
From thread 1 idx 0 idx2 0
From thread 0 idx 0 idx2 1
From thread 1 idx 0 idx2 1
From thread 0 idx 0 idx2 2
From thread 1 idx 0 idx2 2
From thread 0 idx 0 idx2 3
From thread 1 idx 0 idx2 3
From thread 0 idx 1 idx2 0
From thread 1 idx 1 idx2 0
From thread 0 idx 1 idx2 1
From thread 1 idx 1 idx2 1
From thread 0 idx 1 idx2 2
From thread 1 idx 1 idx2 2
From thread 0 idx 1 idx2 3
From thread 1 idx 1 idx2 3
From thread 0 idx 2 idx2 0
From thread 1 idx 2 idx2 0
From thread 0 idx 2 idx2 1
From thread 1 idx 2 idx2 1
From thread 0 idx 2 idx2 2
From thread 1 idx 2 idx2 2
From thread 0 idx 2 idx2 3
From thread 1 idx 2 idx2 3
То, что происходит выше, состоит в том, что 2 потока назначены для выполнения двух вложенных циклов, и в результатеони производят вышеуказанный вывод (2 * 3 * 4 = всего 24 сообщения журнала), что просто.
Но теперь рассмотрим следующий код, в котором внутренний цикл for объявлен как pragma omp for
std::size_t idx;
std::size_t idx2;
omp_set_num_threads( 2 );
#pragma omp parallel default(shared) private(idx, idx2)
{
for(std::size_t idx=0;idx<3;idx++)
{
#pragma omp for
for(std::size_t idx2=0;idx2<4;idx2++)
{
LOG("From thread "+std::to_string(omp_get_thread_num())+" idx "+std::to_string(idx)+" idx2 "+std::to_string(idx2));
}
}
}
Это приводит к следующим 3 * 4 = 12 сообщениям в журнале:
From thread 0 idx 0 idx2 0
From thread 1 idx 0 idx2 2
From thread 0 idx 0 idx2 1
From thread 1 idx 0 idx2 3
From thread 0 idx 1 idx2 0
From thread 1 idx 1 idx2 2
From thread 0 idx 1 idx2 1
From thread 1 idx 1 idx2 3
From thread 0 idx 2 idx2 0
From thread 0 idx 2 idx2 1
From thread 1 idx 2 idx2 2
From thread 1 idx 2 idx2 3
Я бы ожидал, что еще два потока будут назначены коду, соответствующему двум внутренним циклам for, и получим снова 24выходные сообщения.Почему выходные данные отличаются в этих двух случаях?