为什么c++中的多线程会降低性能
why multithreading in c++ reduces the performance
在这段代码中,多线程正在降低性能:
unsigned long num1 = 0;
unsigned long num2 = 0;
thread myThread1(count1,&num1);
thread myThread2(count2, &num2);
myThread1.join();
myThread2.join();
cout << num1 << endl;
cout << num2 << endl;
void count1(unsigned long *num1){
long b = clock();
while( clock() - b < 1000)
{
(*num1)++;
}
}
void count2(unsigned long *num2){
long b = clock();
while( clock() - b < 1000)
{
(*num2)++;
}
}
最后num1=6900000和num2=700000(num1和num2按这个顺序),但当我在单线程模式下运行时(当我评论第二个线程时),num=16000000,所以多线程会降低性能。为什么会发生这种情况?通过在num1和num2(64字节)之间添加一个pad,性能会变得更好,但仍然比单线程(num1,num2=750000)差
(当性能更好时,CPU可以计数更多,但在第一部分计数1300000,在第二部分计数1600000)
(num1和num2仅用于计数)
这是整个代码(编辑)
速度减慢的可能原因是num
变量可能共享一个缓存行。
在这种情况下,当核心1上的线程1更新num1
时,那么也必须在核心2上的线程2上更新变量,这将减慢num2
的更新。对于num2
,反之亦然。
这是考虑到您实际上是在将线程固定在核心上(这种情况也会减慢执行速度)。
尝试声明num1
,用64字节填充,然后声明num2
。
这将由适当的配置文件工具(如VTune(现已免费))进行标记。这也可以适当地衡量性能。
在阅读线程代码后,您实际上只是在增加变量一段时间(它是std::clock()
吗?不是衡量性能的最佳方式,尤其是对于多线程,这就是硬件计数器的作用,而且循环似乎很小,例如,您应该测量一秒钟),所以您可能真的有错误的共享。在应用程序上运行VTune,并检查缓存无效计数器,它应该是通过屋顶。
线程化并不一定意味着更快,它意味着它们可以根据体系结构并发/并行进行。存在与线程相关联的开销。
此外,重要的是你的编译器设置以及优化是否开启
如果你试图并行运行的函数很快,那么线程的开销将抵消任何好处。
- 在main()之外初始化std::vector会导致性能下降(多线程)
- Linux VM(重型多线程应用程序)的性能改进
- 使用较新版本的 g++ 导致多线程性能下降?
- 在多线程环境中使用 libcurl 会导致与 DNS 查找相关的性能非常慢
- C++多线程性能比单线程代码慢
- 提升 asio io_service多线程性能不佳
- 多线程功能性能比单线螺纹差
- 为什么c++中的多线程会降低性能
- 内存分配对多线程性能的影响
- C 11多线程在神经网络中的性能非常缓慢
- 2个数组/图像相乘的多线程性能-英特尔IPP
- 与单线程相比,c++/java的多线程性能结果参差不齐
- 可以通过减少多线程中系统调用(互斥/信号量)的开销来真正提高性能::atomic
- 为什么具有多线程的for循环的性能不如单线程
- 考虑 CPU 提升模式的多线程超线性性能实现
- 为什么这种令人尴尬的并行算法的性能没有随着多线程而提高
- C++独立数据的多线程性能
- C/C++分配器在多线程环境下的性能如何
- 如果我有固定数量的相互独立的计算,多线程会显著提高性能吗?
- PC多线程性能和稳定性问题的简单基准测试.如何使每个线程在单独的核心上运行