为什么c++中的多线程会降低性能

why multithreading in c++ reduces the performance

本文关键字:性能 多线程 c++ 为什么      更新时间:2023-10-16

在这段代码中,多线程正在降低性能:

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,并检查缓存无效计数器,它应该是通过屋顶。

线程化并不一定意味着更快,它意味着它们可以根据体系结构并发/并行进行。存在与线程相关联的开销。

此外,重要的是你的编译器设置以及优化是否开启

如果你试图并行运行的函数很快,那么线程的开销将抵消任何好处。