У меня есть потенциально простой вопрос, но, глядя на СО, я не мог найти вопросов, которые задавали совершенно то же самое. Мой вопрос: будет ли предложение collapse
в коде OpenMP ниже правильно обрабатывать обе внутренние петли? Или он только рухнет с первым внутренним циклом?Специальный случай краха OpenMP
!$omp parallel do collapse(2) private(iy, ix, iz)
do iy = 1, ny
do ix = 1, nx
! stuff
enddo
do iz = 1, nz
! different stuff
enddo
enddo
!$omp end parallel do
Этот код компилируется для меня и, очевидно, показывает преимущества распараллеливания. Однако я знаю, что в стандарте указано:
Все петли, связанные с конструкцией цикла, должны быть полностью вложены; то есть не должно быть промежуточного кода или любой директивы OpenMP между любыми двумя циклами.
Так что моя реакция кишки заключается в том, что OpenMP только сворачивает первый внутренний контур (ix
). Но тогда как он обрабатывает второй внутренний цикл (iz
)?
Я, очевидно, пытаясь код, чтобы сделать следующее, но это намного уродливее и многословным, чтобы написать код так:
!$omp parallel private(iy, ix, iz)
!$omp do collapse(2)
do iy = 1, ny
do ix = 1, nx
! stuff
enddo
enddo
!$omp end do nowait
!$omp do collapse(2)
do iy = 1, ny
do iz = 1, nz
! different stuff
enddo
enddo
!$omp end do nowait
!$omp end parallel do
nowait на втором деле ничего не делает, поскольку параллельный конец имеет барьерную семантику. – Jeff