Ich versuche, die Berechnung der Norm2 eines Vektors (variable Größe) zu parallelisieren. Mein Ansatz war, zuerst den Vektor unter den Prozessoren zu streuen, das Quadrat und die Summe der einzelnen Untervektoren zu berechnen und dann die Reslut zu reduzieren und die Quadratwurzel anzuwenden.How to Scatter dann Reduce mit MPI und C++
Hier ist mein Code:
#include <mpi.h>
#include <vector>
#include <iostream>
#include <cmath>
double SquareSum(std::vector<double> & v) {
double res;
for (std::vector<double>::iterator it = v.begin(); it != v.end(); it++){
if (*it){
res += (*it)*(*it);
}
else{
it++;
}
}
return res;
}
int main(int argc, char *argv[]){
std::vector<double> numbers;
double val;
while (std::cin >> val) numbers.push_back(val);
MPI_Init(&argc,&argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
unsigned numbers_count = numbers.size();
MPI_Bcast(&numbers_count, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
unsigned local_share = numbers_count/size; // local_share is the floor function of numbers.size()/number of process
if (numbers_count % size > 0){
++local_share; // if size is not a multiple of numbers.size() add 1 to local_share in order to make it "fit"
}
if (rank == 0){
numbers.resize(local_share*size); //resize numbers by adding null empty spot if necessary
}
//std::cout << "I'm" << rank << std::endl;
std::vector<double> local(local_share);
MPI_Scatter(&numbers, local_share, MPI_DOUBLE, &local, local_share, MPI_DOUBLE, 0, MPI_COMM_WORLD);
double par_sum = SquareSum(local);
double sum = 0;
MPI_Reduce(&par_sum, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0){
std::cout << "norm : " << std::sqrt(sum);
}
MPI_Finalize();
return 0;
}
Wenn ich versuche, das Programm Ich habe diesen Fehler auszuführen:
„mpiexec diesen Prozess Rang bemerkte 2 mit PID 9823 auf Knoten Laptop auf Signal verlassen 11 (Segmentierungsfehler). "
Ich vermute, es gibt ein Problem mit der Streuung, aber ich kann nicht herausfinden, was.
Danke für die Hilfe
'& number' und' & local' sind die Adressen der Kontrollstrukturen der Vektorobjekte, nicht die Daten, die sie enthalten. Probieren Sie stattdessen '& numbers [0]' und '& local [0]' aus. –
Ich ändere den Code und ich habe den gleichen Fehler. Aber ich habe etwas recherchiert und könnte auf einen Mangel an Speicher zurückzuführen sein. (so etwas wie addind swap) – LaGranf