小编use*_*358的帖子

使用重载运算符减少OpenMP

我正在尝试使用OpenMP在以下函数中并行化循环

 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;
     }
Run Code Online (Sandbox Code Playgroud)

当我编译代码时,它给出以下消息:

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’
Run Code Online (Sandbox Code Playgroud)

我知道变量'force0'和'torque0'既不是双重或整数类型的数据,而是类型'CPnt',这是一个定义为表示空间中三维向量的类.对于类'CPnt',运算符'+'和' - '已经由运算符重载定义.所以我的问题是:OpenMP的减少是否真的无法处理这样的重载运算符?有没有其他方法可以将此循环与OpenMP并行化而不减少'force0'和'torque0'的每个组件?

非常感谢.

c++ parallel-processing operator-overloading openmp

6
推荐指数
1
解决办法
2787
查看次数

如何在python中同时读取和处理多个文件

我有多个文件,我想同时读取它们,从每行中提取一个数字并进行平均值.对于少量文件,我在itertools模块中使用izip执行此操作.这是我的代码.

from itertools import izip
import math

g=open("MSDpara_ave_nvt.dat",'w')

with open("sample1/err_msdCECfortran_nvt.dat",'r') as f1, \
     open("sample2/err_msdCECfortran_nvt.dat",'r') as f2, \
     open("sample3/err_msdCECfortran_nvt.dat",'r') as f3, \
     open("err_msdCECfortran_nvt.dat",'r') as f4:

     for x,y,z,bg in izip(f1,f2,f3,f4):
         args1=x.split()
         i1 = float(args1[0])
         msd1 = float(args1[1])


         args2=y.split()
         i2 = float(args2[0])
         msd2 = float(args2[1])


         args3=z.split()
         i3 = float(args3[0])
         msd3 = float(args3[1])

         args4=bg.split()
         i4 = float(args4[0])
         msd4 = float(args4[1])


         msdave = (msd1 + msd2 + msd3 + msd4)/4.0

         print>>g, "%e  %e" %(i1, msdave)

 f1.close()
 f2.close()
 f3.close()
 f4.close()
 g.close()
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但是,如果我想同时处理100个文件,如果我这样做,代码会变得非常冗长.还有其他更简单的方法吗?似乎fileinput模块也可以处理多个文件,但我不知道它是否可以同时执行.

谢谢.

python

2
推荐指数
1
解决办法
6037
查看次数