【发布时间】:2012-09-28 12:20:49
【问题描述】:
我正在 MATLAB 中编写 mex 代码来执行和操作(因为该操作使用 c++ 中的库)。 mex 代码有一个部分,其中有一个函数在循环中以不同的参数值重复调用,并且每个函数调用都是独立的(即,1 个调用的计算不依赖于先前的调用)。因此,为了加快速度,我编写了创建多个线程的多线程代码 - 线程的确切数量等于循环迭代的数量,在我的示例中,此值为 10。每个线程计算循环中的函数以获得单独的值参数,线程返回并加入,完成更多计算并返回结果。 所有这一切理论上应该给我很好的加速,但我看到多线程代码比普通的单线程代码慢很多!我可以使用非常强大的 24 核机器,所以这完全令人困惑,因为我希望每个线程都被安排在一个单独的核心上。 对导致这种情况的任何想法?导致此问题的代码中是否存在任何常见问题/错误?
任何帮助将不胜感激。
编辑: 为了回答这里人们提出的解决方案中提出的许多疑问,我想分享一些关于我的代码的信息: 1. 每个函数调用都需要几分钟,因此线程的同步和生成不应该是开销(尽管如果在这种情况下有任何缓解情况,任何有关这方面的信息都会非常有帮助!)
每个线程都会访问公共数据结构、数组、矩阵,但这些值根本不会被覆盖。所有对变量的写入都是对线程本地的变量、指针、数组等进行的。所以,我猜这里应该不会有很多缓存未命中?
我的代码中也没有互斥体部分,因为没有线程写入任何公共内存位置。所有写入都写入线程本地的内存位置。
我仍在尝试找出我的多线程实现无法正常工作的原因:(因此,任何指针/信息都会非常有帮助!
谢谢!!
【问题讨论】:
-
每个函数调用需要多长时间?如果是 uS 而不是几十毫秒,那么您可能是在浪费时间。一般来说,由于持续的开销和阻塞,create/join/destroy 几乎是最糟糕的线程化方式。不要问我为什么它在每个线程教程书/网站的第一页,因为我的回答可能会冒犯作者。请改用池或一些专用的应用程序生命周期线程。
-
你试过调试它吗?尝试在代码中打印一些调试行 - 例如 - “线程 1 启动任务 3”、“线程 2 启动任务 6”、...等
-
可能你使用的 C++ 库已经是多线程的了……
-
@angainor - 这就是为什么我首先问'每个函数调用需要多长时间?'。
-
@MartinJames 当然,我忽略了它。这只是在您评论的开头;)
标签: c++ multithreading matlab mex