多线程调用同一个函数的问题

clj277265010 2016-11-17 11:18:33
大家好,最近在用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:能否对同一个曲面进行多个实例化,每个线程分开调用对象的成员函数,这样就可以让速度与线程数成正比?
...全文
764 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-11-18
  • 打赏
  • 举报
回复
《30天自制操作系统》
pengzhixi 2016-11-18
  • 打赏
  • 举报
回复
与线程数并不成什么比例关系。 提升的因素主要是:1.cpu个数或者核数 2. 代码真正能并行执行所占总代码的比率。 当然其他的线程或者任务的切换都是影响的因素。
ztenv 版主 2016-11-18
  • 打赏
  • 举报
回复
有的效率提升与线程成正比,大多数则不成正比。
fefe82 2016-11-18
  • 打赏
  • 举报
回复
速度基本不会跟线程数成正比。因为开线程、线程调度、线程同步操作也会有一定的消耗。 同时,当线程数增加超过 CPU 的空闲核数的时候,还会越变越慢。
gurlsandguys 2016-11-18
  • 打赏
  • 举报
回复
调用函数都应该是使用新的函数实例的吧,确定你并行了4个线程的话,其实不按照线性增长也是可能的,这个很多方面有关,可能是操作对象的访问权是否独占之类的,该方法是否设置标志令牌还是无法访问时重试等等。
我也不是学计算机的,难得网上吹吹牛,不要信了啊
张小飞Official 2016-11-18
  • 打赏
  • 举报
回复
还是得看你的代码速度,因为切换线程也得需要开销,不成正比,一般不开比自己cpu线程数大的线程个数
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧