[英]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.