Sto cercando di parallelizzare il ciclo nel seguente funzione con OpenMPriduzione OpenMP con operatore di overload
void CEnergymulti::forcetwobody(vector<CMolecule*> m_mols,CPnt force0,CPnt torque0)
{
const int nmol=m_mols.size();
vector<CMolecule*> twomols(2);
CPnt forcetemp,torquetemp;
twomols.clear();
force0.zero();
torque0.zero();
forcetemp.zero();
torquetemp.zero();
#pragma omp parallel for reduction(+:force0,torque0) private(twomols)
for(int j=1;j<nmol;j++)
{ twomols.push_back(m_mols[0]);
twomols.push_back(m_mols[j]);
CMolecule::polarize_mutual(twomols,false, 1000);
twomols[0]->computeMol_Force_and_Torque(forcetemp,torquetemp);
force0+=forcetemp;
torque0+=torquetemp;
forcetemp.zero();
torquetemp.zero();
twomols.clear();
}
REAL converter=COUL_K*IKbT;
force0*=converter;
torque0*=converter;
return;
}
Quando compilo il codice, dà il seguente messaggio:
EnergyD_multi.cpp: In static member function ‘static void
CEnergymulti::forcetwobody(std::vector<CMolecule*,
std::allocator<CMolecule*> >, CPnt, CPnt)’: EnergyD_multi.cpp:226:
error: ‘torque0’ has invalid type for ‘reduction’
EnergyD_multi.cpp:226: error: ‘force0’ has invalid type for
‘reduction’
ho capito che le variabili 'force0' e 'torque0' non sono né il tipo di dati double o integer, ma di tipo 'CPnt', una classe che è definita per rappresentare vettori tridimensionali nello spazio. Per la classe 'CPnt', l'operatore '+' e '-' sono già stati definiti dall'overloading dell'operatore. Quindi le mie domande sono: è vero che la riduzione in OpenMP non può gestire tali operatori sovraccaricati? Esistono modi alternativi per parallelizzare questo ciclo con OpenMP senza ridurre i componenti di "force0" e "torque0"?
Grazie mille.
Hai funzionato? Ho cambiato il tuo codice per eseguire l'operazione di sovraccarico con OpenMP. Fammi sapere se funziona. Si prega di vedere il link per capire l'idea principale nel caso ci sia un bug. –
Grazie mille @raxman. Con lo schema di parallelizzazione hai suggerito che il codice potrebbe essere compilato. Tuttavia, sono ancora un po 'confuso riguardo la parallelizzazione del ciclo con 'nowait'. Questo perché credo ancora che per ogni thread le variabili nel ciclo "twomols" e "forcetemp" debbano essere considerate "private", ma non le hai elencate come private. – user2226358
Tutto all'interno di "#pragma omp parallel" è privato per definizione. Solo force0 e torque0 sono condivisi perché sono al di fuori del prompma omp –