我试图玩std库,特别是线程之一。 这个想法是用多线程和不用多线程来填充矩阵。我有8个内核。C++多线程std库:比预期慢
void fillMatrix(int ID, std::vector<std::vector<double>> & lMatrix,int inThread){
for (int i = 0; i < 10000; ++i){
if (i % inThread == ID){
for (int j = 0; j < 10000; ++j){
lMatrix[i][j] = 123456.0;
}
}
}
}
void testMT(int inThread){
std::vector<std::thread> lPool;
std::vector<std::vector<double>> lMatrix(10000, std::vector<double>(10000));
for (int i = 0; i < inThread; ++i){
lPool.push_back(std::thread(std::bind(&fillMatrix,i, lMatrix,inThread)));
}
for (std::thread & t : lPool){
t.join();
}
}
的主要代码:
int main(){
const clock_t begin_time1 = clock();
testMT(1);
std::cout << float(clock() - begin_time1)/CLOCKS_PER_SEC;
}
testMT(1)取2.1秒运行,而testMT(8)开7.032秒。
有什么想法? 谢谢。
我的猜测是分支预测失败。如果通过让外层循环在'ID'开始并通过'inThread'增加来消除'if',会发生什么? –
所以你测量的总CPU时间,在八个线程中会比一个更大。 –
比较1次填充矩阵调用与8次调用。为什么你决定8次呼叫必须快于1? – AnatolyS