es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Division de iteraciones MPI

Hay una matriz de vectores de 8 elementos (número de núcleos), en el bucle, cada vector se pasa a la función. Es necesario hacerlo en MPI para que el bucle se ejecute en paralelo y tan pronto como un proceso encuentre un valor, se termina el trabajo del resto de los procesos. Lo hice en OMP, pero desafortunadamente no entiendo el MPI.

double t1 = omp_get_wtime();

pragma omp parallel

{

pragma omp for nowait

for (int c = 0; c < 8; c++) {
    vector<double> result = GradDown(x[c], 0.000000000001);
}
double t2 = omp_get_wtime();
cout << "time: " << t2 - t1 << "\n"  << endl;

}

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar el bucle en paralelo utilizando MPI, se debe inicializar MPI, determinar el número de procesadores disponibles y distribuir la carga de trabajo entre ellos.

    Aquí hay una posible solución:

    “`c++
    #include <mpi.h>
    #include

    using namespace std;

    int main(int argc, char* argv[]) {
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    
    vector<double> results(8);
    
    double t1 = MPI_Wtime();
    
    for (int c = rank; c < 8; c += size) {
        results[c] = GradDown(x[c], 0.000000000001);
    
        if (results[c] == target_value) {
            break;
        }
    }
    
    double t2 = MPI_Wtime();
    
    if (rank == 0) {
        cout << "tiempo: " << t2 - t1 << endl;
    }
    
    MPI_Finalize();
    return 0;
    

    }
    “`

    En este código, cada proceso ejecuta el bucle para cada 8 elementos, pero con un punto de inicio diferente y un paso igual al número total de procesos. Los resultados se almacenan en el vector results, que es compartido entre todos los procesos.

    Si un proceso encuentra el valor objetivo, se rompe el bucle y los otros procesos también dejarán de ejecutar sus bucles ya que comparten la misma declaración if. La medición del tiempo y la salida solo se realiza en el proceso principal (rango 0).

    Hay que tener en cuenta que esta solución asume que la función GradDown es segura para subprocesos y se puede ejecutar en paralelo sin efectos secundarios.</mpi.h>

Comments are closed.