maratrus
|
old hand
|
|
|
|
Рег.: 06.01.2007
|
Сообщений: 781
|
|
Рейтинг: 332
|
|
OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
09.04.2011 21:01
|
|
|
Не могли бы вы помочь ответить вот на какой вопрос: внутри PARALLEL блока идет вызов подпрограммы, которая, схематично, выполняет следующую последовательность действий:
code:
SUBROUTINE TEST()
...
INTEGER M, N
REAL,ALLOCATABLE:: TMP(:,:)
...
ALLOCATE(TMP(M,N))
....
DEALLOCATE(TMP)
...
END
Предположим, что MPI версия программы запускается на N вычислительных узлах и на каждом узле запускаем два треда. Тогда наблюдается такая картина, что оба треда на каждом вычислительном узле заходят в эту функцию, но РОВНО один (тот, который пришел первым) из этих двух успешно зовет ALLOCATE и переходит к выполнению следующей строчки, а ДРУГОЙ застревает в вызове ALLOCATE и не переходит к выполнению следующей за вызовом ALLOCATE строчки.
Можете ли вы предположить, почему так происходит? Особенность компилятора? Или ошибка в программе?
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
09.04.2011 21:29
|
|
|
а что за кластер, если не секрет? На каком-нибудь BG/P, например, есть 'thread-safe' версии скриптов для компиляции, что может включать в себя теоретически линковку с потокобезопасной стандартной библитекой, в которой может быть реализован этот механизм ALLOCATE просто гадаю
|
|
maratrus
|
old hand
|
|
|
|
Рег.: 06.01.2007
|
Сообщений: 781
|
|
Рейтинг: 332
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: unkulunkulu]
09.04.2011 21:51
|
|
|
BG/P. Я так понимаю ты имеешь в виду скрипты вида *_r. Так, я сейчас использую mpixlf77_r для компиляции. Если у тебя был опыт, буду благодарен, если ты им поделишься.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
10.04.2011 01:00
|
|
|
с фортраном - нет, к сожалению ![:(](/images/graemlins/frown.gif)
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
10.04.2011 01:41
|
|
|
ну попробуй просто для проверки это дело в omp critical (в терминах C++) засунуть пробовал? Я имею в виду allocate. Или весь блок между allocate и deallocate (хотя это уже жесть, похоже).
|
|
1017
|
addict
|
|
|
|
Рег.: 16.10.2008
|
Сообщений: 441
|
|
Рейтинг: 422
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
10.04.2011 09:44
|
|
|
а OpenMP - это фортран что ли? синтаксис как в фортране
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: 1017]
10.04.2011 10:21
|
|
|
OpenMP - это набор расширений для компиляторов (я сейчас знаю о фортране и C/C++) для написания многопоточных приложений.
Например, хочется цикл for(i = 0; i < 10000000; ++i) распараллелить, пишешь (C++):
#pragma omp parallel for
for( int i = 0; i < 10000000; ++i ) {
//...
}
![:ooo:](/images/graemlins/ooo.gif)
|
|
maratrus
|
old hand
|
|
|
|
Рег.: 06.01.2007
|
Сообщений: 781
|
|
Рейтинг: 332
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: unkulunkulu]
10.04.2011 11:40
|
|
|
В ответ на:
с фортраном - нет, к сожалению ![:(](/images/graemlins/frown.gif)
Я постоянно не поспеваю за его логикой ![:(](/images/graemlins/frown.gif)
Я попробовал вместо ALLOCATABLE сделать POINTER, теперь память выделяют все массивы, но программа падает на попытке освободить память, то есть при вызове DEALLOCATE. ![:(](/images/graemlins/frown.gif)
Не очень хочется тыкаться, хочется понимать, что делаешь.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
10.04.2011 11:58
|
|
|
Quote:
Не очень хочется тыкаться, хочется понимать, что делаешь.
ну иногда это единственный способ ![:grin:](/images/graemlins/grin.gif)
|
|
Keres
|
Raver
|
|
|
|
Рег.: 27.10.2003
|
Сообщений: 4699
|
Из: Теплый Стан
|
Рейтинг: 3879
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
10.04.2011 12:55
|
|
|
TMP сидит в private?
|
Dance hard. Die fast.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: Keres]
10.04.2011 13:01
|
|
|
оно в отдельной функции, вызываемой из parallel-блока. Оно может быть shared по умолчанию?
|
|
maratrus
|
old hand
|
|
|
|
Рег.: 06.01.2007
|
Сообщений: 781
|
|
Рейтинг: 332
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: Keres]
10.04.2011 13:08
|
|
|
Нет, TMP - локальная переменная функции TEST.
|
|
epsilon
|
enthusiast
|
|
|
|
Рег.: 01.04.2007
|
Сообщений: 376
|
|
Рейтинг: 411
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
15.04.2011 04:13
|
|
|
Вот этот код компилируется и нормально работает (gfortran 4.1 - 4.4):
code: MODULE MOD_OMP
PUBLIC :: TEST
CONTAINS
SUBROUTINE TEST(M, N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, N
INTEGER :: I, J
REAL, DIMENSION(:,:), ALLOCATABLE :: TMP
ALLOCATE(TMP(M,N))
DO J = 1,N
DO I = 1,M
TMP(I,J) = I+J
ENDDO
ENDDO
DEALLOCATE(TMP)
END SUBROUTINE TEST
END MODULE MOD_OMP
PROGRAM MAIN
USE MOD_OMP
IMPLICIT NONE
INTEGER :: I
!$OMP PARALLEL DO &
!$OMP DEFAULT(NONE) &
!$OMP PRIVATE(I)
DO I = 1,1000
CALL TEST(1000,500)
ENDDO
!$OMP END PARALLEL DO
END PROGRAM
Может быть проблема в том, что ты пытаешься использовать MPI и OpenMP одновременно?
|
|
epsilon
|
enthusiast
|
|
|
|
Рег.: 01.04.2007
|
Сообщений: 376
|
|
Рейтинг: 411
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: epsilon]
15.04.2011 04:29
|
|
|
так и есть: вместо mpi_init() надо вызывать MPI_INIT_THREAD(MPI_THREAD_FUNNELED, PROVIDED, IERROR) и по результату в PROVIDED определять, разрешено ли данному треду использовать MPI вызовы.
|
|
maratrus
|
old hand
|
|
|
|
Рег.: 06.01.2007
|
Сообщений: 781
|
|
Рейтинг: 332
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: epsilon]
15.04.2011 17:41
|
|
|
В ответ на:
так и есть: вместо mpi_init() надо вызывать MPI_INIT_THREAD(MPI_THREAD_FUNNELED, PROVIDED, IERROR) и по результату в PROVIDED определять, разрешено ли данному треду использовать MPI вызовы.
Безусловно, так и делается.
Проблема была в компиляторе - mpixlf77_r заменил на mpixlf90_r. Либо никто не использует mpixlf77, либо я не смогу найти информации, что MPI+OpenMP может работать некорректно.
P.S. А у тебя в программе количество тредов задается в переменной окружения?
|
|
epsilon
|
enthusiast
|
|
|
|
Рег.: 01.04.2007
|
Сообщений: 376
|
|
Рейтинг: 411
|
|
Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
[re: maratrus]
16.04.2011 14:20
|
|
|
Quote:
А у тебя в программе количество тредов задается в переменной окружения?
да, через OMP_NUM_THREADS. Но я ничего не считал на BG/P и не большой эксперт по MPI.
Quote:
Проблема была в компиляторе - mpixlf77_r заменил на mpixlf90_r
Отлично, что нашел решение. А разве 77-й фортран поддерживает динамическое выделение памяти?
|
|