segurança thread de MPI enviar usando segmentos criados com std :: async
De acordo comesse site, o uso deMPI::COMM_WORLD.Send(...)
é thread-safe. No entanto, na minha aplicação, frequentemente (nem sempre) me deparo com deadlocks ou obtenho falhas de segmentação. Anexando cada chamada deMPI::COMM_WORLD
métodos com ummutex.lock()
emutex.unlock()
remove consistentemente deadlocks, bem como segfaults.
É assim que eu crio tópicos:
const auto communicator = std::make_shared<Communicator>();
std::vector<std::future<size_t>> handles;
for ( size_t i = 0; i < n; ++i )
{
handles.push_back(std::async(std::launch::async, foo, communicator));
}
for ( size_t i = 0; i < n; ++i )
{
handles[i].get();
}
Communicator
é uma classe que tem umstd::mutex
membro e chama exclusivamente métodos comoMPI::COMM_WORLD.Send()
eMPI::COMM_WORLD.Recv()
. Eu não uso nenhum outro método de envio / recebimento com MPI.foo
Leva umconst std::shared_ptr<Commmunicator> &
como argumento.
Minha pergunta: A segurança de thread prometida pela MPI não é compatível com os threads criados porstd::async
?