У меня вопрос о Fortran-OpenMP и размещаемых массивах. Все просто: где будет размещаться пространство? Если у меня есть что-то вроде
!$omp parallel default(shared) private(arr)
!$omp critical
allocate( arr(BIGNUMBER) )
!$omp end critical
!do calculations with many arr accesses
!$omp critical
deallocate( arr )
!$omp end critical
!$omp end parallel
будет ли выделено место в стеке или куче? Если он находится в куче, есть ли разница между приведенным выше кодом и чем-то вроде этого
allocate( arr(BIGNUMBER, nThread) )
!$omp parallel default(shared) private(localArr)
iThread = omp_get_thread_num()
localArr => arr(:, iThread)
!do calculations with many localArr accesses
!$omp end parallel
deallocate( arr )
- В первом коде есть две критические области. Я бы предположил, что они замедлили бы выполнение и не очень хорошо масштабировались. (На самом деле я не уверен, могу ли я просто пропустить их, потому что выделение выполняется с сохранением потоков?) Но если массив был выделен в стеке, это должно быть быстрее из-за более быстрого доступа.
- Во втором коде я уверен, что массив находится в куче, что обеспечивает более медленный доступ. Но если массив в первом коде также размещен в куче, я сохраню критические реакции + это только одно выделение / освобождение. Должно быть быстрее?
- Не играет ли здесь какой-то роли размер массива?
- Если бы он был выделен в куче, есть ли способ принудительно выделить его в стеке?
Короткий вопрос в основном таков: какое решение проблемы кажется оптимальным?
localArr => arr...
, но это означает, чтоarr
используется совместно между потоками. Я думаю, ты этого не хочешь. УказательlocalArr
будет иметь копию для каждого потока, но указанное содержимое будет совместно использоваться. Изменения в одном потоке содержимого массива будут отражены в других потоках. - person Jason   schedule 07.12.2017