Как успешно скомпилировать mpi4py с помощью стека MPI MS HPC Server 2008 R2? - PullRequest
5 голосов
/ 22 августа 2011

Итак, история гласит: мне нужна оболочка MPI для Python.

Я знаю, что есть mpi4py .Для текущей работы я (в основном) использую Python и Windows, я хотел бы использовать Microsoft HPC Cluster Pack, имеющий доступ к нескольким довольно «сильным» машинам, работающим под управлением Win 2008 Server.Просто упомяну, кроме Win-опыта, у меня есть немного опыта * nix с MPI и прочим, но это довольно спорный вопрос для этой проблемы.

Мой интерес к mpi4py возобновился, когда я столкнулся с Инструменты Python для Visual Studio .Это действительно классные вещи.Любой, кто является поклонником Visual Studio и Python, должен попробовать это.Хорошая работа и отличный отладчик.

На страницах документации PTVS говорится, что установка mpi4py проста ... и для ActiveState Python это похоже на правду.Однако, если вы не используете Python ActiveState и вместо этого используете «нормальный» дистрибутив Python из python.org, вам немного не повезло.

Моя машина для разработки - это ноутбук с 64-битной Win7 и Python 2.6, как в 64-битном, так и в 32-битном вариантах.Я установил MS HPC Pack 2008 R2 MS MPI и SDK.У меня Visual Studio 2008 и 2010, все покорно исправлено.

Нет бинарного установщика, и, зная, как Unix MPI могут быть чрезвычайно требовательны к версии MPI, с которой они связаны, я хотел создать свой собственный mpi4py.mpi4py в основном полагается на наличие MPI .dll (на самом деле .pyd), который связывает вызовы python с библиотеками MPI.

easy_install mpi4py и сборка этой библиотеки завершилась неудачно - невозможность указать на библиотеки MPI.Хорошо, нет проблем, я скачал tarball mpi4py, распаковал его и изменил файл mpi.cfg , чтобы он указывал на правильные папки:

# Microsoft MPI example
# ---------------------
[msmpi]
define_macros = MS_MPI=1
mpi_dir = $CCP_HOME
include_dirs = %(mpi_dir)s\Inc
libraries = msmpi
library_dirs = %(mpi_dir)s\lib\i386

Установщик MS MPI регистрируетпеременная окружения CCP_HOME, указывающая на точное место установки пакета.Название «CCP» должно быть оставлено с тех дней, когда оно называлось Microsoft Compute Cluster Pack.Должен передать это первоначальному разработчику mpi4py.

После этого компиляция проходит нормально, но я не могу связать - есть три неразрешенных внешних кода:

MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_integer@8 referenced in ...
MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_real@12 ...
MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_complex@12 ...

Кажется, что MSMPI msmpi.lib из HPC 2008 R2 не реализует их, поэтому я не могу собрать MPI.pyd.

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

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 08 марта 2013

Я разговаривал с @Hrvoje и текущим сопровождающим исходного кода по адресу https://code.google.com/p/mpi4py/

Спасибо, ребята, за вашу помощь.
Я использовал Visual Studio 2012, Python 2.7.3 (64bit) и MPI4PY 1.3

Вот изменения:

  • mpi-заголовки и библиотеки теперь находятся в другом месте (MS HPC 2008 R2), так что моя часть msmpimpi.cfg теперь выглядит следующим образом:

    [msmpi]
    mpi_dir = $ProgramFiles\Microsoft HPC Pack 2008 R2
    include_dirs = %(mpi_dir)s\inc
    libraries = msmpi
    #library_dirs = %(mpi_dir)s\lib\i386
    library_dirs = %(mpi_dir)s\lib\amd64
    
  • Поскольку среда сборки Python ищет Visual Studio 2008, мне пришлось вручную добавить нужную переменную.На самом деле он указывает на каталог VS 2012, но все инструменты сборки совместимы, поэтому он работал.Это то, что я добавил.

    VS90COMNTOOLS = C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
    

Кроме этого, изменений не было, и файл setup.py без проблем выполнил как .exe, так и .msi.

1 голос
/ 23 августа 2011

Я знаю, что немного странно отвечать на мой вопрос, но это может кому-то помочь.Аналогичная проблема возникает в Linux, поскольку не во всех реализациях MPI реализованы все объявленные вызовы.

Похоже, что у автора mpi4py также была довольно большая нагрузка, когда он что-то решал ...

Если вы объединяете отсутствующие / неработающие вещи MPI-2 в MPICH1 / LAM / OpenMPI / MPICH2 (и производных реализациях, таких как Deino, Microsoft / Sun / SGI), вы в конечном итоге получаетечтобы проверить множество вещей ...

По причинам, указанным выше, вы можете скомпилировать библиотеку mpi4py без некоторых функций.Исходный файл «missing.h» в tar-архиве mpi4py обрабатывает эти ситуации.

Итак, я определил это:

PyMPI_MISSING_MPI_Type_create_f90_integer
PyMPI_MISSING_MPI_Type_create_f90_real
PyMPI_MISSING_MPI_Type_create_f90_complex

Скомпилированная таким образом библиотека-оболочка вызовет ошибку, если когда-либо будет вызвана какая-либо из этих отсутствующих функций.Это отсутствует .h из mpi4py, который заботится об этом.Вы можете сделать это, либо добавив #defines в соответствующий файл напрямую, либо добавив его в самом конце файла setup.cfg в архиве mpi4py:

[build_ext]
define = PyMPI_MISSING_MPI_Type_create_f90_integer, PyMPI_MISSING_MPI_Type_create_f90_real, PyMPI_MISSING_MPI_Type_create_f90_complex

Итак, удачи в использовании mpi4pyи MS MPI ... Надеюсь, это помогло кому-то еще, кроме меня ...

...