На каждом mpi-процессе основным потоком запускается ещё 2 потока. Основной поток приложения выполняет вычисления, второй поток выполняет только прием данных, третий только отправку. Вычисления на основном потоке ведутся порциями, при наработке очередной порции данных выполняется их отправка третьим потоком. Т.е. здесь происходит отправка по событию. Второй поток работает всё время в режиме ожидания. По буферам выделяемым в программе пересечения между ними нет.
Одновременно в процессе из разных потоков могут вызываться только функции MPI_Isend(MPI_Bsend), MPI_Irecv(MPI_Recv). Оба потока(2 и 3) работают на одном коммуникаторе. Коммуникатор создавал дублируя основной коммуникатор процесса(MPI_Comm_dup). Всё.
Проблема: запуск падает и есть соответственно два предположения. 1) вызовы mpi-функций на одном коммуникаторе из нескольких потоков одновременно не безопасны. 2) ошибка не связанная с пунктом 1.
Я не нашел в стандарте упоминания является ли вызов из разных потоков mpi-функций безопасным по требованию или зависит от реализации, или безопасно ли работать на одном коммуникаторе из разных потоков — пока это главный вопрос.
Можно реализовать по другому, но тут вопрос принципа — хотелось бы понять в чем дело.
Такая вот проблема. Если есть какие соображения поделитесь пожалуйста.
Здравствуйте, _Vasilyev, Вы писали:
_V>Я не нашел в стандарте упоминания является ли вызов из разных потоков mpi-функций безопасным по требованию или зависит от реализации, или безопасно ли работать на одном коммуникаторе из разных потоков — пока это главный вопрос.
Не имею ни малейшего представления о mpi, но отмечу, что функции редко бывают потокобезопасными — гораздо чаще обеспечение ее перекладывается на вызовы. И это правильно, потому что ничего бесплатного не бывает, а потокобезопасность не всем нужна.
А что за стандарт такой ? Надо просто смотреть документацию по этой библиотеке.
PD>Не имею ни малейшего представления о mpi, но отмечу, что функции редко бывают потокобезопасными — гораздо чаще обеспечение ее перекладывается на вызовы. И это правильно, потому что ничего бесплатного не бывает, а потокобезопасность не всем нужна.
Так то оно так, сам всегда исхожу из этого предположения.
PD>А что за стандарт такой ? Надо просто смотреть документацию по этой библиотеке.
MPI — это интерфейс распараллеливания программ основанный на обмене сообщениями между процессами. На эту штуку есть стандарт, ну типа C, C++ или OpenMP. Под этот стандарт есть различные реализации. Знаю есть у microsoft, intel, есть открытый проект mpich2. Вот.
Здравствуйте, _Vasilyev, Вы писали:
_V>Я не нашел в стандарте упоминания является ли вызов из разных потоков mpi-функций безопасным по требованию или зависит от реализации, или безопасно ли работать на одном коммуникаторе из разных потоков — пока это главный вопрос.
см. документацию по MPI_Init_thread. кратко — можно, если реализация поддерживает.