Compilando o Boost: Resolução de Problemas com MPI

Fonte oficial do Boost:

  • boost_1_89_0.7z

Ambiente: VS2022

Nota: A versão 1.83.0 não compilou corretamente, por isso optei pela versão 1.89.0

Entre no ambiente através do prompt de comando "x64 Native Tools Command Prompt for VS 2022".

:: Navegue para o diretório com os fontes descompactados
cd /d xxx\boost_1_89_0
:: Gere o executável b2
bootstrap.bat

Comandos de Compilação

:: Comando de compilação
b2 --without-test --without-python toolset=msvc address-model=64 variant=release link=shared runtime-link=shared threading=multi stage
:: Comando de instalação
b2 --without-test --without-python toolset=msvc address-model=64 variant=release link=shared runtime-link=shared threading=multi --prefix=install install

O log de compilação mostrou que a maioria dos módulos compilou com sucesso, mas ocorreu uma exceção no módulo MPI:

error: No best alternative for /F:/dev-tool/libs/boost_1_89_0/libs/mpi/build/boost_mpi with <abi>ms <address-model>64 <architecture>x86 <asynch-exceptions>off <binary-format>pe <boost.beast.allow-deprecated>on <boost.beast.separate-compilation>on <boost.cobalt.executor>any_io_executor <boost.cobalt.pmr>std <context-impl>fcontext <coverage>off <debug-store>object <debug-symbols>off <embed-manifest-via>linker <embed-manifest>on <exception-handling>on <extern-c-nothrow>off <inlining>full <known-warnings>hide <link></link>shared <midl-robust>yes <midl-stubless-proxy>yes <optimization>speed <os>NT <pch>on <preserve-test-targets>on <profiling>off <python-debugging>off <rtti>on <runtime-debugging>off <runtime-link>shared <stdlib>native <strip>off <target-os>windows <testing.execute>on <threadapi>win32 <threading>multi <version>14.3 <toolset>msvc <variant>release <vectorize>off <visibility>hidden <warnings-as-errors>off <warnings>on <windows-api>desktop <x-deduced-platform>x86_64
    matched: (empty)
    matched: (empty)
</x-deduced-platform></windows-api></warnings></warnings-as-errors></visibility></vectorize></variant></toolset></version></threading></threadapi></testing.execute></target-os></strip></stdlib></runtime-link></runtime-debugging></rtti></python-debugging></profiling></preserve-test-targets></pch></os></optimization></midl-stubless-proxy></midl-robust></known-warnings></inlining></extern-c-nothrow></exception-handling></embed-manifest></embed-manifest-via></debug-symbols></debug-store></coverage></context-impl></boost.cobalt.pmr></boost.cobalt.executor></boost.beast.separate-compilation></boost.beast.allow-deprecated></binary-format></asynch-exceptions></architecture></address-model></abi>

Buscando implementações MPI compatíveis, a documentação menciona as seguintes bibliotecas:

  • Open MPI
  • MPICH2
  • Intel MPI

Contudo, uma sugestão indicou o uso do MS-MPI, que foi testado primeiro.

Tentativa de Correção com MS-MPI

Endereço de download do SDK

Script de compilação

:: Configurar variáveis de ambiente
set MSMPI_INC=C:\Program Files (x86)\Microsoft SDKs\MPI\Include
set MSMPI_LIB=C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64
:: Comando de compilação
b2 -j8 toolset=msvc address-model=64 link=shared runtime-link=shared variant=release threading=multi --with-mpi mpi-include="%MSMPI_INC%" mpi-libpath="%MSMPI_LIB%"

Exceção encontrada

error: unknown feature "<mpi-include>"
F:/dev-tool/libs/boost_1_89_0/tools/build/src/build\feature.jam:361: in expand-subfeatures-aux from module feature
F:/dev-tool/libs/boost_1_89_0/tools/build/src/build\feature.jam:422: in feature.expand-subfeatures from module feature
F:/dev-tool/libs/boost_1_89_0/tools/build/src/build\build-request.jam:20: in apply-to-property-set from module build-request
(builtin):-1: in sequence.transform from module sequence
F:/dev-tool/libs/boost_1_89_0/tools/build/src/build\build-request.jam:32: in build-request.expand-no-defaults from module build-request
F:/dev-tool/libs/boost_1_89_0/tools/build/src\build-system.jam:808: in module scope from module build-system
</mpi-include>

Tentativa de correção

Conforme mencionado em um blog, foi necessário adicionar a seguinte configuração no arquivo project-config.jam:

using mpi ;

Tentativa de compilação

b2 -j8 toolset=msvc address-model=64 link=shared runtime-link=shared variant=release threading=multi --with-mpi

Exceção encontrada

...failed compile-c-c++ bin.v2\libs\mpi\build\msvc-14.3\release\x86_64\threading-multi\content_oarchive.obj...
compile-c-c++ bin.v2\libs\mpi\build\msvc-14.3\release\x86_64\threading-multi\mpi_datatype_cache.obj
mpi_datatype_cache.cpp
.\boost/mpi/exception.hpp(86): warning C4251: "boost::mpi::exception::message":"std::basic_string<char>,std::allocator<char>>" precisa de interface DLL para uso por clientes de "boost::mpi::exception"
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\include\xstring(541): note: veja a declaração de "std::basic_string<char>,std::allocator<char>>"
.\boost/mpi/exception.hpp(33): warning C4275: classe de interface não DLL "std::exception" usada como base de classe de interface DLL "boost::mpi::exception"
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\include\vcruntime_exception.h(49): note: veja a declaração de "std::exception"
.\boost/mpi/exception.hpp(33): note: veja a declaração de "boost::mpi::exception"
.\boost/mpi/detail/mpi_datatype_primitive.hpp(62): warning C4267: "parâmetro": conversão de "size_t" para "int", possível perda de dados
.\boost/mpi/detail/mpi_datatype_primitive.hpp(81): warning C4267: "parâmetro": conversão de "size_t" para "int", possível perda de dados
.\boost/mpi/detail/mpi_datatype_cache.hpp(49): warning C4275: classe de interface não DLL "boost::noncopyable_::noncopyable" usada como base de classe de interface DLL "boost::mpi::detail::mpi_datatype_map"
.\boost/core/noncopyable.hpp(38): note: veja a declaração de "boost::noncopyable_::noncopyable"
.\boost/mpi/detail/mpi_datatype_cache.hpp(48): note: veja a declaração de "boost::mpi::detail::mpi_datatype_map"
.\boost/mpi/datatype.hpp(217): error C2065: "MPI_CXX_BOOL": identificador não declarado
</char></char></char></char>

O MS-MPI parece não ser compatível com a versão mais recente do Boost, pois sua última versão data de 2019. Decidiu-se por abandonar essa abordagem.

Tentativa de Correção com Intel MPI

Devido à incompatibilidade do MS-MPI, optou-se pelo Intel MPI. O arquivo project-config.jam foi modificado da seguinte forma:

Página de download do Entel MPI

  • Intel-mpi-2021.18.0.742_offline

Modificação do arquivo project-config.jam

using mpi
  : "C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/bin/mpicxx.exe"
  :
    <include>"C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/include"
    <library-path>"C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/lib"
    <find-static-library>impi
  ;
</find-static-library></library-path></include>

Comando de compilação

:: Compilar apenas o módulo mpi
b2 -j8 toolset=msvc address-model=64 link=shared runtime-link=shared variant=release threading=multi --with-mpi
:: Se não houver erros, compile todos os módulos
b2 --without-test --without-python -j4 toolset=msvc address-model=64 variant=release link=shared runtime-link=shared threading=multi stage
:: Após a compilação, instale no diretório [install]. Renomeie o arquivo INSTALL para INSTALL_ para evitar conflitos
b2 --without-test --without-python -j4 toolset=msvc address-model=64 variant=release link=shared runtime-link=shared threading=multi --prefix=install install

Bibliotecas DLL geradas pela compilação completa

cd install/lib
dir /b *.dll
boost_atomic-vc143-mt-x64-1_89.dll
boost_charconv-vc143-mt-x64-1_89.dll
boost_chrono-vc143-mt-x64-1_89.dll
boost_container-vc143-mt-x64-1_89.dll
boost_context-vc143-mt-x64-1_89.dll
boost_contract-vc143-mt-x64-1_89.dll
boost_coroutine-vc143-mt-x64-1_89.dll
boost_date_time-vc143-mt-x64-1_89.dll
boost_fiber-vc143-mt-x64-1_89.dll
boost_filesystem-vc143-mt-x64-1_89.dll
boost_graph-vc143-mt-x64-1_89.dll
boost_graph_parallel-vc143-mt-x64-1_89.dll
boost_iostreams-vc143-mt-x64-1_89.dll
boost_json-vc143-mt-x64-1_89.dll
boost_locale-vc143-mt-x64-1_89.dll
boost_log-vc143-mt-x64-1_89.dll
boost_log_setup-vc143-mt-x64-1_89.dll
boost_math_c99-vc143-mt-x64-1_89.dll
boost_math_c99f-vc143-mt-x64-1_89.dll
boost_math_c99l-vc143-mt-x64-1_89.dll
boost_math_tr1-vc143-mt-x64-1_89.dll
boost_math_tr1f-vc143-mt-x64-1_89.dll
boost_math_tr1l-vc143-mt-x64-1_89.dll
boost_mpi-vc143-mt-x64-1_89.dll
boost_nowide-vc143-mt-x64-1_89.dll
boost_process-vc143-mt-x64-1_89.dll
boost_program_options-vc143-mt-x64-1_89.dll
boost_random-vc143-mt-x64-1_89.dll
boost_regex-vc143-mt-x64-1_89.dll
boost_serialization-vc143-mt-x64-1_89.dll
boost_stacktrace_from_exception-vc143-mt-x64-1_89.dll
boost_stacktrace_noop-vc143-mt-x64-1_89.dll
boost_stacktrace_windbg-vc143-mt-x64-1_89.dll
boost_stacktrace_windbg_cached-vc143-mt-x64-1_89.dll
boost_thread-vc143-mt-x64-1_89.dll
boost_timer-vc143-mt-x64-1_89.dll
boost_type_erasure-vc143-mt-x64-1_89.dll
boost_url-vc143-mt-x64-1_89.dll
boost_wave-vc143-mt-x64-1_89.dll
boost_wserialization-vc143-mt-x64-1_89.dll

Arquivo project-config.jam completo

# Configuração do Boost.Build
# Gerado automaticamente por bootstrap.bat
 
import option ;
 
using msvc ;
using mpi
  : "C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/bin/mpicxx.exe"
  :
    <include>"C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/include"
    <library-path>"C:/Program Files (x86)/Intel/oneAPI/mpi/2021.18/lib"
    <find-static-library>impi
  ;
 
option.set keep-going : false ;
</find-static-library></library-path></include>

Compilando o Boost 1.85.0 (Problema de detecção do compilador)

Ambiente de compilação: VS2022 Community Edition mais recente

Exceção Encontrada

Ao usar o VS2022 Community Edition, o bootstrap.bat gerou o b2.exe com sucesso, mas ao executar o seguinte comando, ocorreu um problema:

b2 address-model=64 variant=release link=shared runtime-link=shared threading=multi --without-python --without-test -j4 stage

Erro: compilador não encontrado

Realizando verificações de configuração

    - default address-model    : none [1]
    - default architecture     : none [1]
    - x86                      : no [2]
    - arm                      : no [2]
    - mips1                    : no [2]
    - power                    : no [2]
    - sparc                    : no [2]
    - cxx11_static_assert      : no [2]
    - x86                      : no [3]
    - arm                      : no [3]
    - mips1                    : no [3]
    - power                    : no [3]
    - sparc                    : no [3]
    - cxx11_static_assert      : no [3]
    - cxx11_variadic_templates : no [2]
    - cxx11_variadic_templates : no [3]
    - cxx11_hdr_ratio          : no [2]
    - cxx11_hdr_ratio          : no [3]
    - cxx20_hdr_concepts       : no [2]
    - cxx20_hdr_concepts       : no [3]

Solução

Conforme indicado em blogs, a versão do VS2022 é muito recente para ser reconhecida pelo b2. A solução é especificar manualmente a verssão do compilador.

Determine a versão do MSVC usando o comando PATH no prompt "x64 Native Tools Command Prompt for VS 2022". Você encontrará algo como:

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX64\x64

Modifique o arquivo project-config.jam no diretório raiz para especificar a versão e o caminho do MSVC:

# Configuração do Boost.Build
# Gerado automaticamente por bootstrap.bat
 
import option ;
 
using msvc : 14.44 : "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.44.35207\\bin\\HostX64\\x64\\cl.exe";
 
option.set keep-going : false ;

Usar a ferramenta especificada

:: Compilar
b2 toolset=msvc-14.44 address-model=64 variant=release link=shared runtime-link=shared threading=multi --without-python --without-test -j4 stage
:: Instalar no diretório install. Renomeie o arquivo INSTALL para outro nome para evitar conflitos
b2 toolset=msvc-14.44 address-model=64 variant=release link=shared runtime-link=shared threading=multi --without-python --without-test -j4 --prefix=install install

Relação entre versões do VS, ferramentas e macros

Tags: boost MPI compilacao C++ Visual Studio

Publicado em 7-8 18:37