c++ - 多线程 mex 代码比单线程慢

标签 c++ multithreading matlab mex

我正在 MATLAB 中编写 mex 代码来执行和操作(因为该操作使用 c++ 中的库)。 mex 代码有一个部分,其中有一个函数在循环中使用不同的参数值重复调用,并且每个函数调用都是独立的(即,1 次调用的计算不依赖于先前的调用)。因此,为了加快速度,我编写了创建多个线程的多线程代码——线程的确切数量等于循环迭代的次数,在我的示例中,该值为 10。每个线程计算循环中的函数以获得单独的值参数,线程返回并加入,完成更多计算并返回结果。 所有这些在理论上应该给我很好的加速,但我看到多线程代码比普通的单线程代码慢很多!!我可以访问非常强大的 24 核机器,所以这完全令人困惑,因为我希望每个线程都被安排在一个单独的核心上。 对导致这种情况的原因有什么想法吗?代码中是否存在导致此问题的常见问题/错误?

任何帮助将不胜感激。

编辑: 为了解答大家提出的解决方案中的诸多疑惑,我想分享一些关于我的代码的信息: 1. 每个函数调用都需要几分钟,因此线程的同步和生成在这里不应成为开销(尽管如果在这种情况下有任何缓解情况,任何相关信息都会非常有帮助!)

  1. 每个线程确实会访问公共(public)数据结构、数组、矩阵,但其中的值根本不会被覆盖。所有对变量的写入都是对线程本地的变量、指针、数组等进行的。所以,我猜这里应该不会有很多缓存未命中?

  2. 我的代码中也没有互斥部分,因为没有线程写入任何公共(public)内存位置。所有写入都写入线程本地的内存位置。

我仍在努力找出我的多线程实现不工作的原因:(所以,任何指针/信息都会非常有帮助!

谢谢!!

最佳答案

鉴于您的问题很笼统,一般的答案是可能有两种影响:

  • 启动和停止线程(以及同步它们)的开销很大,而且计算缩放不足以克服开销。每次函数调用的总次数将阐明这个问题。
  • 线程可以相互竞争并降低总体性能。一种常见的机制是“缓存抖动”。由于多个内核共享同一个内存 Controller 和部分高速缓存层次结构,一个线程可以用它需要的信息填充高速缓存,只是为了让不同线程的需要逐出一些数据,导致更多的主内存访问。由于主内存访问成本如此之高,最终结果是速度变慢。

我会用不同数量的线程测试作业。例如,可能会证明使用两个线程是有利的,但四个或更多则不是。要获得更详细的答案,请向问题添加更多详细信息,例如计算类型、数据集大小等。

关于c++ - 多线程 mex 代码比单线程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639926/

相关文章:

c++ - C 从 GetSaveFileName() 返回的字符包含空字符

java - 为什么这里的volatile和synchronized语句无法避免线程干扰呢?

c# - 从正在运行的线程 C# 更改窗体的属性

matlab - Matlab匿名函数为什么叫anonymous?

matlab - 不同长度的向量之间的相关性

c++ - 虚拟文件系统是该应用程序的正确概念吗

c++ - 在 C++ 中使用指针算法迭代类数据成员

matlab - 将任意数量的矩阵乘以任意次数

c++ - 在 switch 语句中分配 lambda

c# - 防止 WinForms PictureBox 动画 GIF 在处理过程中暂停?