为什么多线程不提供加速?
Why doesn't multi-threading offer speedup?
我注意到使用这个简单的示例多线程几乎总是需要更长的时间。我只是在我制作的这段代码中对其进行测试。我在 24 核处理器上使用它。似乎使用 2 个线程效果最好,3 个或更多线程比使用 1 个最差。
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
using namespace std;
mutex total;
mutex coutLock;
mutex order;
long long sum=1000000000;
long long mysum=0;
const int threads=3;
long long x;
void dowork(int x,int threads) {
long long temp=0;
for(long long i=x*sum/threads;i<((x+1)*sum/threads);i++) {
temp+=i;
}
total.lock();
mysum+=temp;
total.unlock();
}
int main() {
thread * pool[threads];
for(x=0;x<threads;x++) {
thread *mine=new thread(dowork,x,threads);
pool[x]=mine;
}
for(x=0;x<threads;x++) {
pool[x]->join();
}
cout<<"My sum is: "<<mysum<<endl;
}
dowork()
中的循环可以简化为 O(1) 代码,计算公式如下:
temp = (b - a + 1) * a + (b - a) * (b - a + 1) / 2
where a = x * sum / threads, b = (x + 1) * sum / threads - 1
例如,clang++ 3.5.1 实际上会生成这样的代码。不幸的是,在这种情况下,计算量与线程数成正比。
你的代码太简单了,编译器可能会在单核运行中做一些优化(比如自动矢量化)。
创建新线程在某种程度上也是一个昂贵的操作,单个线程甚至可以在创建线程之前完成。程序中的常见做法是创建一些线程池,然后使用此池中的线程。它们不需要再次分配,因此在运行时使用它们的速度更快。但这并不是为了像这样一个简单的应用程序。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程蒙特卡罗计算中没有加速
- 为什么对于简单的数组复制来说,没有多线程加速
- 使用多线程在c++中生成mandelbrot映像.没有加速
- 为什么多线程不提供加速?
- 多线程c++程序加速一个求和循环
- 使用多线程(std::async、std::thread或?)加速
- 映射模式在多线程程序中的性能低于预期(4倍加速vs 8倍加速)