这是我代码的主要部分,为了加快速度,我使用了如下所示的多线程,所以我的基本想法是简单地将它们分成 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 函数(不是确切的代码),我使用 lock 锁定 push_back 部分以避免它们同时写入该 list
vector (顺序无关紧要)。
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 个内核,每个内核都有两个超线程?如果是后者,超线程会相互干扰,并且您无法获得从单独内核获得的全部加速。
关于c++ - 如何提高C++中的多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41488325/