为什么我的程序性能随着线程数的增加而下降?

时间:2021-02-02 11:49:46

标签: c++ multithreading concurrency

我正在学习多线程编程。我编写了一个简单的程序,但随着线程数的增加,程序的性能会下降。 我想在所有线程完成 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';
}

1 个答案:

答案 0 :(得分:0)

<块引用>

为什么我的程序的性能随着线程数的增加而下降?

可能是由于硬件原因。我假设你在一些 x86/64 处理器上运行一些 Linux。

处理器的硬件定义量为 cores。根据处理器的价格,它可能有 2 到 64 个内核。在 Linux 上,您可以使用 lscpu 命令或 cat /proc/cpuinfo 来查找。见proc(5)

您的线程都是 CPU 密集型的。因此,如果运行的线程数超过您拥有的内核数,您将不会获得太多收益。

此外,您的线程正在访问一些常见的 RAM,然后 CPU caches 很重要。阅读cache coherency protocols