none
не консольный (GUI) MPI не запускается на x64 RRS feed

  • Вопрос

  • пробую пускать свой GUI-MPI-проект на машине с архитектурой x64,
    сначала думал, что проблема не связана с MPI, поэтому решил на x64 отладить свой проект:

    1. поставил на x64 HPC Pack 2008 SDK
    2. поставил туда же заплатку HPC Pack 2008 SDK Fix for "Procedure entry point could not be located" issue
    3. начал отладку проекта

    ставлю брейкпойнт на MPI_Init_thread:

    if( ( Err = ::MPI_Init_thread( &__argc, &__argv, MPI_THREAD_FUNNELED, &mpi_provided ) ) != MPI_SUCCESS ){
    	PRINT_MPI_ERROR( Err );
    	PRINT_TRACE;
    	//
    	::SetLastError( ERROR_MPI );
    	return FALSE;
    }

    после того, как срабатывает брейкпойнт, жму F10 или F11 и отладка обрывается,
    т.е. просто процесс завершается без всяких сообщений и событий в журнале

    напоминаю: проект GUI'шный, т.е. консоли там по-умолчанию нет (я ее сам создаю в определенный момент, для служебной печати)

    с помощью флага -debug к mpiexec определил, что MPI_Init_thread в этот момент выдает следующий лог:

    ...
    [01:1680] reading failed, assuming stdout is closed. error 0xc000014b
    [01:1680] process refcount == 1, stdout closed.
    [01:1680] reading failed, assuming stderr is closed. error 0xc000014b
    [01:1680] process refcount == 0, stderr closed.
    [01:1680] process refcount == 0, waiting for the process to finish exiting.
    ...

    более полный лог:

    ...
    [00:1660] handling command:
    [00:1660]  src  = 1
    [00:1660]  dest = 0
    [00:1660]  cmd  = result
    [00:1660]  tag  = 1
    [00:1660]  ctx  = left child
    [00:1660]  str  = cmd=result src=1 dest=0 tag=1 result=SUCCESS cmd_tag=1 pg_id=D6323720-CE9F-4986-A6B2-A1CF8ECB4A47 pg_rank=0 pg_ctx=0
    [00:1660] 0 -> 0 : returning NULL context
    [00:1660] successfully launched: 'cmd=launch src=0 dest=1 tag=1 c="Z:\\My Documents\\Visual Studio 2008\\Projects\\x64\\Debug\\GUI-test.exe" args="\"Z:\\My Documents\\Visual Studio 2008\\Projects\\x64\\Debug\\GUI-test.exe\"" s=0 a=0 d=C:\Users\mega q=0 i=0 n=1 k=D6323720-CE9F-4986-A6B2-A1CF8ECB4A47 kd=2B9F9C87-A996-4a48-994E-D369279EFBEB '
    [00:1660] root process launched, starting stdin redirection.
    [00:1660] posting a read for a command header on the left child context, sock 280
    [01:1680] reading failed, assuming stdout is closed. error 0xc000014b
    [01:1680] process refcount == 1, stdout closed.
    [01:1680] reading failed, assuming stderr is closed. error 0xc000014b
    [01:1680] process refcount == 0, stderr closed.
    [01:1680] process refcount == 0, waiting for the process to finish exiting.
    [01:1680] creating an exit command for rank 0, pid 1412, exit code 0.
    [00:1660] read command header
    [01:1680] wrote command
    [00:1660] command header read, posting read for data: 84 bytes
    [01:1680] command written to parent: "cmd=exit src=1 dest=0 tag=2 rank=0 code=0 kvs=D6323720-CE9F-4986-A6B2-A1CF8ECB4A47 "
    [00:1660] read command
    [00:1660] read command: "cmd=exit src=1 dest=0 tag=2 rank=0 code=0 kvs=D6323720-CE9F-4986-A6B2-A1CF8ECB4A47 "
    ...

    пробовал уже просто в WinMain'е первым делом вызывать MPI_Init_thread, результат тот же,
    а вот на x86 машине и отладка и локальный запуск работает правильно,

    в чем тут может быть дело, кто-нибудь объяснит?

    • Перемещено Yuriy Lenchenkov 21 декабря 2010 г. 14:27 (От:Windows HPC Server 2008)

Все ответы

  • видимо, надо как-то отключить stdin-stdout redirection
    у планировщика есть немного похожая возможность(HPC_ATTACHTOCONSOLE), и по умолчанию она выключена,

    а вот у mpiexec я такого не нашел

    полагаю, проблема связана с тем, что HPC Pack 2008 SDK по разному обрабатывает ситуацию, связанную с отсутствием консоли:
    в исполнении для x86 - спокойно продолжает работу,
    а в исполнении для x64 - завершает критический, с точки зрения MPI, процесс

    сейчас я решил эту проблему разделением проектов: GUI-клиент отделен от консольного MPI-сервера, но тем не менее, для быстрой реализации задачи это намного усложняет разработки (приходится явно выделять зависимости клиента и сервера и следить за изменениями протокола обмена в обоих проектах, в одном проекте это делать гораздо проще)