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;
}
“`
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);
}
“`
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>