我試圖並行在下面的函數循環使用OpenMPOpenMP的減少與重載運營商
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;
}
當我編譯的代碼,它提供了以下消息:
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’
我明白變量'force0'和'torque0'既不是雙重數據也不是整型數據,而是'CPnt'類型,這是一種定義爲表示空間中三維向量的類。對於'CPnt'類,運算符'+'和' - '已經由運算符重載定義。所以我的問題是:在OpenMP中的減少不能處理這樣的重載操作符嗎?有沒有其他方法可以將這個循環與OpenMP並行化,而不需要減少'force0'和'torque0'的每個組件?
非常感謝。
您是否得到了應有的工作?我更改了代碼以使用OpenMP執行過載操作。讓我知道它是否有效。如果有錯誤,請參閱鏈接以瞭解主要思想。 – 2013-04-25 19:32:24
非常感謝@raxman。使用並行化方案,您建議可以編譯代碼。不過,我仍然對與'nowait'的循環並行化有點困惑。這是因爲我仍然認爲對於每個線程來說,循環'twomols'和'forcetemp'中的變量應該被視爲'私人',但是您沒有將它們列爲私人。 – user2226358 2013-04-26 06:35:55
「#pragma omp parallel」中的所有內容都是私人定義的。只有force0和torque0是共享的,因爲它們不在omp pragma – 2013-04-26 06:40:14