我正在学习多线程编程。我编写了一个简单的程序,但随着线程数的增加,程序的性能会下降。
我想在所有线程完成 thread_local_init()
后测量我的程序,所以我使用 flag
进行同步。
但是 elapsed.count() 的值随着线程数的增加而增加。
这是我的代码:
#define THREADS 64 //32 //16 //8 //2
#define OPS 100*1024*1024
std::atomic<int> flag(0);
__thread int init[1024];
uint64_t* ptr_array;
std::chrono::time_point<std::chrono::system_clock> start;
void thread_local_init(){
for(int i=0;i<1024;i++) init[i]=i;
}
void do_alloc(int id){
thread_local_init();
flag++;
uint64_t each_ops = OPS / THREADS;
uint64_t w_start = each_ops * id;
uint64_t w_end = each_ops * (id+1);
while(flag!=THREADS){
}
start = std::chrono::system_clock::now();
for(uint64_t i=w_start;i<w_end;i++){
ptr_array[i] = i;
}
}
int main(int argc, char** argv){
std::thread threads[THREADS];
ptr_array = (uint64_t*)malloc(sizeof(ptr_array)*OPS);
for (int i = 0; i < THREADS; i++) {
threads[i] = std::thread(do_alloc,i);
}
for (auto& t: threads) {
t.join();
}
auto end = std::chrono::system_clock::now();
auto elapsed = end - start;
std::cout << elapsed.count() << '\n';
}
答案 0 :(得分:0)
为什么我的程序的性能随着线程数的增加而下降?
可能是由于硬件原因。我假设你在一些 x86/64 处理器上运行一些 Linux。
处理器的硬件定义量为 cores。根据处理器的价格,它可能有 2 到 64 个内核。在 Linux 上,您可以使用 lscpu
命令或 cat /proc/cpuinfo
来查找。见proc(5)。
您的线程都是 CPU 密集型的。因此,如果运行的线程数超过您拥有的内核数,您将不会获得太多收益。
此外,您的线程正在访问一些常见的 RAM,然后 CPU caches 很重要。阅读cache coherency protocols。