大家好,最近在用OPENMP做一个多线程并行问题。
用#pragma omp parallel for 对一个双重循环的内循环做并行化以后,发现速度提升与使用线程数不正比(四核四线程速度提升2倍)。
for (int iX = 0; iX < nX; ++iX)
{
#pragma omp parallel for
for (int iY = 0; iY < nY; ++iY)
{
if (SurfaceBoundBox[iSurface].InBoundingBox(planePoint)&&
m_Surfaces[iSurface]->IntersectionOfCurveSurface(surfacePoint, aLine)) //曲面曲线求交
}
}
{
其中的IntersectionOfCurveSurface函数,即曲线与曲面(曲面类在FOR循环外部已经实例化)求交,这个函数每次调用都要1s左右。而且我没有这个函数的实现,所以不能在函数内部对FOR进行并行。
我想关键在于:每一个内循环都要调用同一个m_Surfaces[iSurface]对象的IntersectionOfCurveSurface函数,所以当不同的曲线对同一个曲面求交时,即多个线程同时调用同一个对象的成员函数时,速度没有同线程数成正比。
问题1:小弟不是学计算机的,不知道上面的理解对不对?
问题2:能否对同一个曲面进行多个实例化,每个线程分开调用对象的成员函数,这样就可以让速度与线程数成正比?