I recently learned wie die Methode eines Objekts zu einer Funktion für die Auswertung übergeben werden und jetzt möchte ich OpenMP
in einer Schleife verwenden, während diese Methode aufrufen. Der eigentliche Code ist:Verwenden von OpenMP beim Aufruf mit einem Zeiger auf eine Methode
std::vector< std::vector<double> > grid2D(wfn& W, double (wfn::*p)(double, double, double), std::vector<double> xs, std::vector<double> ys, double z) {
std::vector< std::vector<double> > fs;
int nx = (int)xs.size();
int ny = (int)ys.size();
fs.resize(nx);
for(int ix = 0; ix < nx; ix++) {
fs[ix].resize(ny);
for(int iy = 0; iy < ny; iy++) {
fs[ix][iy] = (W.*p)(xs[ix], ys[iy], z);
}
}
return fs;
}
wo wfn
die „Wellenfunktion“ eines Moleküls darstellt und viele, viele private Variablen gespeichert, um die Physik zu repräsentieren.
Wenn ich #pragma omp parallel for
über die Schleife über iy
einfügen, ist die Rastergenerierung von fs[ix][iy]
falsch. Gibt es eine Möglichkeit W.*p
als privat an diese #pragma
zu übergeben, so dass die Auswertung von Threadssafe ist?
Ist p eine 'const' Methode? Kannst du "W" als "const" übergeben? Wenn nicht, was passiert mit dem Zustand von "W" innerhalb von "p"? – Zulan