Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=10131335&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 13:37:39 2016
Кодировка: Windows-1251
OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
maratrus
old hand

Рег.: 06.01.2007
Сообщений: 781
Рейтинг: 332
  OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока
      09.04.2011 21:01
1

Не могли бы вы помочь ответить вот на какой вопрос:
внутри 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 :confused: просто гадаю

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
 

с фортраном - нет, к сожалению :(

unkulunkulu
unkulunkulunkulu

Рег.: 12.11.2006
Сообщений: 18453
Из: 13000
Рейтинг: 11759
  Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока [re: maratrus]
      10.04.2011 01:41
 

ну попробуй просто для проверки это дело в omp critical (в терминах C++) засунуть :confused: пробовал? Я имею в виду allocate. Или весь блок между allocate и deallocate (хотя это уже жесть, похоже).

1017
addict

Рег.: 16.10.2008
Сообщений: 441
Рейтинг: 422
  Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока [re: maratrus]
      10.04.2011 09:44
-1

а OpenMP - это фортран что ли? синтаксис как в фортране

unkulunkulu
unkulunkulunkulu

Рег.: 12.11.2006
Сообщений: 18453
Из: 13000
Рейтинг: 11759
  Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока [re: 1017]
      10.04.2011 10:21
2

OpenMP - это набор расширений для компиляторов (я сейчас знаю о фортране и C/C++) для написания многопоточных приложений.

Например, хочется цикл for(i = 0; i < 10000000; ++i) распараллелить, пишешь (C++):
#pragma omp parallel for
for( int i = 0; i < 10000000; ++i ) {
 //...
}


:ooo:

maratrus
old hand

Рег.: 06.01.2007
Сообщений: 781
Рейтинг: 332
  Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока [re: unkulunkulu]
      10.04.2011 11:40
 


 
В ответ на:


с фортраном - нет, к сожалению :(
  



Я постоянно не поспеваю за его логикой :(

Я попробовал вместо ALLOCATABLE сделать POINTER,
теперь память выделяют все массивы, но программа падает
на попытке освободить память, то есть при вызове
DEALLOCATE. :(

Не очень хочется тыкаться, хочется понимать, что делаешь.

unkulunkulu
unkulunkulunkulu

Рег.: 12.11.2006
Сообщений: 18453
Из: 13000
Рейтинг: 11759
  Re: OpenMP: ALLOCATABLE - переменная внутри PARALLEL блока [re: maratrus]
      10.04.2011 11:58
 

Quote:

Не очень хочется тыкаться, хочется понимать, что делаешь.


ну иногда это единственный способ :grin:

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-й фортран поддерживает динамическое выделение памяти?

Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в