PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 24 авг 19 18:42

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 4 фев 05 13:22 
Не в сети

Зарегистрирован: 4 фев 05 13:02
Сообщения: 3
Уважаемые гуру и не только.
Начал изучать mpi применительно к фортрану и столкнулся с проблемой пересылки данных типа CHARACTER подпрограммами MPI_SEND и MPI_RECV.

Задание: Надо переслать от одного процесса другому значение символьной переменной. Начнем с одного символа (CHARACTER), а в общем случае - строки (CHARACTER*n)

Что интересно в разных книгах примеры есть, но они на Си, и ни одного на фортране, такое очучение, что авторы сами не знают и потихоньку, умалчивая, обходят это место, приводя Сишный пример.
У кого есть рабочий пример, киньте им в меня, плизз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 05 14:20 
Не в сети

Зарегистрирован: 13 янв 05 13:34
Сообщения: 5
Откуда: SPb
Glupen' писал(а):
Уважаемые гуру и не только.
Начал изучать mpi применительно к фортрану и столкнулся с проблемой пересылки данных типа CHARACTER подпрограммами MPI_SEND и MPI_RECV.

Задание: Надо переслать от одного процесса другому значение символьной переменной. Начнем с одного символа (CHARACTER), а в общем случае - строки (CHARACTER*n)

Что интересно в разных книгах примеры есть, но они на Си, и ни одного на фортране, такое очучение, что авторы сами не знают и потихоньку, умалчивая, обходят это место, приводя Сишный пример.
У кого есть рабочий пример, киньте им в меня, плизз.


Совершенно согласен. Когда распараллеливал наш солвер (1.5года назад) тоже столкнулся с проблемой пересылки символьных данных (строк) в Fortran) Кажется, где-то в документации MPICH было даже упоминание о некорректности работы с character в частном случае. Кончилось все тем, что пришлось написать процедурку, переводящую строку character в массив целых чисел и передавать массив, а потом конвертить обратно:

allocate(iaString(1:len(ch_TurbModel)));
call my_char_int(len(ch_TurbModel),ch_TurbModel,iaString);
call MPI_Bcast(iaString,len(ch_TurbModel),MPI_INTEGER,i_mpiRoot,MPI_COMM_WORLD,ierr);
if(i_mpiMyId.ne.i_mpiRoot) call my_int_char(len(ch_TurbModel),iaString,ch_TurbModel);
deallocate(iaString);

Вот таким вот образом. К сожалению, ничего более разумного тогда придумать не удалось -- по воспоминаниям все попытки передать character напрямую окончились срубанием процессов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 фев 05 18:50 
Не в сети

Зарегистрирован: 4 фев 05 13:02
Сообщения: 3
Не один я бедствую.

Да и я нашел, в разных книгах ПРИМЕРЫ!!! пересылки строки на фортране, а внизу страницы МЭЛКО-МЭЛКО сказано, что не на всех фортранах ето работает.

Лично у меня compaq visual fortran


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 фев 05 19:01 
Не в сети

Зарегистрирован: 4 фев 05 13:02
Сообщения: 3
Кстати в литературе сказано, что первый аргумент - адрес сханения переменной, а не сама переменная. Может в этом загвоздка. А как взять адрес в фортране? MPI_ADDRESS от символьной переменной не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 фев 05 23:59 
Glupen' писал(а):
Кстати в литературе сказано, что первый аргумент - адрес сханения переменной, а не сама переменная. Может в этом загвоздка. А как взять адрес в фортране? MPI_ADDRESS от символьной переменной не работает.


Можно пытаться извращаться и написАть свою обертку для функции пересылки на C, передавать в процедуру -- обертку строку (кстати, это еще отдельная задача -- как передать в процедуру на C фортрановскую строчку) , а уже внутри обертки пересылать сишный массив characterов. Но этот способ ничем не лучше простой процедурки -- конвертора. Я думаю, что сконвертить в целые числа -- это не самый плохой способ решения проблемы..

По поводу косяков с character только вчера обнаружил еще одну приятную вещь -- теперь не знаю что делать ;) http://hp.parallel.ru/parBB/viewtopic.php?t=258


К слову, за все время моей работы с фортраном безмерно раздражало отсутствие описаний того, как реализуются те или другие структуры данных. Вот, например, чем (по существу) отличаются данные pointer от данных allocatable и почему когда передаешь в процедуру большой массив, описанный как pointer, то возникает exception (похоже на переполнение стека), а передача массива allocatable проходит на ура...
Нигде и никогда это не описывается. Все объяснение в стандарте и описании реализаций языка идет на уровне домохозяек -- никакого взгляда со стороны системы, только со стороны недалекого программера. Единственный способ узнать, что реально происходит -- сгенерить asm и посмотреть туды.

Я работаю с Compaq Fortran 6.x и c Intel Fortran 7.0 .


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 19 фев 05 0:06 
Не в сети

Зарегистрирован: 13 янв 05 13:34
Сообщения: 5
Откуда: SPb
Это я был ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB