¿Cuándo necesito usar MPI Barrier ()?


Me pregunto cuándo necesito usar barrera? ¿Lo necesito antes / después de un scatter / gather por ejemplo? ¿O debería OMPI asegurarse de que todos los procesos han alcanzado ese punto antes de la dispersión/recolección? Del mismo modo, después de una emisión, ¿puedo esperar que todos los procesos ya reciban el mensaje?

Author: Paul Price, 2012-11-09

3 answers

Todas las operaciones colectivas en MPI antes de MPI-3.0 están bloqueadas, lo que significa que es seguro usar todos los búferes que se les pasan después de que regresen. En particular, esto significa que todos los datos se recibieron cuando una de estas funciones regresa. (Sin embargo, no implica que todos los datos fueron enviados!) Por lo tanto MPI_Barrier no es necesario (o muy útil) antes/después de las operaciones colectivas, si todos los búferes ya son válidos.

Por favor, también tenga en cuenta que MPI_Barrier no espera mágicamente llamadas sin bloqueo. Si usa un send/recv sin bloqueo y ambos procesos esperan en un MPI_Barrier después del par send/recv, no se garantiza que los procesos envíen / reciban todos los datos después del MPI_Barrier. Use MPI_Wait (y amigos) en su lugar. Así que la siguiente pieza de código contiene errores:

/* ERRORNOUS CODE */

Code for Process 0:
Process 0 sends something using MPI_Isend
MPI_Barrier(MPI_COMM_WORLD);
Process 0 uses buffer passed to MPI_Isend // (!)

Code for Process 1:
Process 1 recvs something using MPI_Irecv
MPI_Barrier(MPI_COMM_WORLD);
Process 1 uses buffer passed to MPI_Irecv // (!)

Ambas líneas que están marcadas con (!) no son seguras!

MPI_Barrier solo es útil en un puñado de casos. La mayoría de las veces no le importa si sus procesos se sincronizan. Mejor lea acerca de bloqueo y no bloqueo de llamadas!

 23
Author: Markus Mayr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-09 11:53:17

Un uso de MPI_Barrier es, por ejemplo, controlar el acceso a un recurso externo, como el sistema de archivos, al que no se accede mediante MPI. Por ejemplo, si quieres que cada proceso escriba cosas en un archivo en secuencia, puedes hacerlo así:

int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
for ( int ii = 0; ii < size; ++ii ) {
    if ( rank == ii ) {
        // my turn to write to the file
        writeStuffToTheFile();
    }
    MPI_Barrier(MPI_COMM_WORLD);
}

De esa manera, puede estar seguro de que no hay dos procesos que llamen simultáneamente a writeStuffToTheFile.

 13
Author: Edric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-09 13:13:27

May MPI_Barrier() no se usa a menudo, pero es útil. De hecho, incluso si estuviera usando la comunicación síncrona, MPI_Send / Recv () solo puede asegurarse de que los dos procesos estén sincronizados. En mi proyecto, un proyecto cuda + MPI, todo lo que usé es comunicación asíncrona. Encontré que en algunos casos si no uso MPI_Barrier () seguido de la función Wait (), la situación en la que dos procesos(gpu) quieren transmitir datos entre sí al mismo tiempo es muy probable que ocurra, lo que podría reducir gravemente la eficiencia del programa. El bicho de arriba me vuelve loco y me toma unos días encontrarlo. Por lo tanto, puede pensar cuidadosamente si usa MPI_Barrier() cuando usa MPI_Isend/Irecv en su programa. A veces sincronizar los procesos no solo es necesario, sino también debe, especialmente ur programa está tratando con el dispositivo.

 0
Author: Freezenfire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-29 11:17:21