Seguridad de subprocesos del envío MPI utilizando subprocesos creados con std :: async
De acuerdo aeste sitio web, el uso deMPI::COMM_WORLD.Send(...)
es hilo seguro. Sin embargo, en mi aplicación a menudo (no siempre) me encuentro en puntos muertos u obtengo fallas de segmentación. Adjuntando cada llamada deMPI::COMM_WORLD
métodos con unmutex.lock()
ymutex.unlock()
Elimina sistemáticamente los puntos muertos y los segregantes.
Así es como creo hilos:
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
es una clase que tiene unastd::mutex
Miembro y llama exclusivamente a métodos comoMPI::COMM_WORLD.Send()
yMPI::COMM_WORLD.Recv()
. No utilizo ningún otro método de envío / recepción con MPI.foo
toma unaconst std::shared_ptr<Commmunicator> &
como argumento
Mi pregunta: ¿la seguridad del hilo prometida por MPI no es compatible con los hilos creados porstd::async
?