繁体   English   中英

如何提高C ++中的多线程性能

[英]How to improve multithread performance in C++

这是我的代码的主要部分,为了加快速度,我正在使用下面显示的多线程,所以我的基本思想是将它们简单地分成12部分,然后让他们分别完成工作

    int Thread_num=12;
    int firstone=0;
    int lastone=vector.size();
    int chunk = (lastone-firstone+(Thread_num-1))/Thread_num;
    std::thread t[Thread_num];       
   for(int i=0;i<Thread_num;i++)
{
  int s =firstone+i*chunk;
  int e = ((s+chunk)<vector.size())? (s+chunk) : vector.size();

  t[i]=std::thread(calculateAll,data,arr,s,e);         
}
for (int i = 0; i < Thread_num; ++i)
{
  t[i].join();
}

这是calculateAll函数(不是确切的代码),我使用锁来锁定push_back部分,以避免它们同时写入该list向量(顺序无关紧要)。

void calculateAll(int ***data,LineIndex* arr,int s,int e)
{
  for(int a=s;a<e;a++)
  {
    function_1(arr) /*do something with array(arr)*/
    result=function_2(data) /*do something with data*/
    mylock.lock();
    list.push_back(result);       
    mylock.unlock();
  }
}

那么从理论上讲,它将加速12倍吗? 当我在代码中使用该想法时,它的速度提高了5到6倍,这有意义吗? 我可以修改一些东西以提高性能,也许使用其他方法吗? 感激

那个lock()unlock()破坏了性能,使您的并行算法变成或多或少的串行算法。 就像其中一条评论所建议的那样,为每个线程分配自己的列表以存储其结果,并在所有线程完成后合并结果。

换句话说,当您说您的服务器具有14个核心时,是实际的物理核心还是7个核心,每个核心都有两个超线程? 如果是后者,则超线程会相互干扰,并且您无法获得单独内核所能提供的完整加速。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM