待解决问题:同一进程的多线程与cpu多核心的关系,是否在同一核心运行,以及什么条件下可以在不同核心运行?
1.问题背景
最近在公司做一个斗地主游戏牌库的设计,需要满足炸弹分布和最少出牌手数的限制,例如“112,3”表示第一个玩家1个炸弹,第二个玩家1个炸弹,第三个玩家两个炸弹,并且除炸弹以外的牌需要在3手以内出完。经过分析后,只有顺子和飞机与牌的点数有关,其他任何组合与牌点无关,是固定值,因此考虑dfs+dp的的算法进行搜索。自认为算法设计没问题,但是还想继续优化速度,因此考虑并行行计算的方式,之前项目中用到的多线程方面的也挺多,但是从没考虑过效率的问题。两个线程在共享同一变量和不共享同一变量时,运行速度差距很大。下面列出代码和各种效率问题,记录一下,后续再研究。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include <boost/thread/thread.hpp>
using namespace std;
int dp[25][25][25][25],card[15],h[15];
int test;
int allTime;
int allTime1;
void fun()
{
//1000000000
for(int i=0;i<1000000000;i++)
{
double a = 3/2*4*5/2*4*4*4*5;
double k = sqrt(a);
double aa = sqrt(k);
test++;
allTime++;
}
}
void fun1()
{
//1000000000
for(int i=0;i<1000000000;i++)
{
double a = 3/2*4*5/2*4*4*4*5;
double k = sqrt(a);
double aa = sqrt(k);
test++;
allTime1++;
}
}
int main( int size, vector<int> arr)
{
test = 0;
allTime = 0;
allTime1 = 0;
boost::thread_group threads;
clock_t start =clock(); //程序开始计时
threads.create_thread(fun);
threads.create_thread(fun1);
threads.join_all();
clock_t end=clock(); //程序结束用时
double endtime=(double)(end-start)/CLOCKS_PER_SEC;
cout<<"Total time:"<<endtime<<endl;
system("pause");
return 0;
}
各种情况以及对应的运行时间:
fun中test条件 | 执行时间 |
---|---|
单线程,test++ | 13.3 |
单线程,无test++ | 13.3 |
双线,无test++ | 12.8 |
双线,test = 1 | 47 |
双线,test = 1 test =2 | 49 |
双线,test = 10000000000 | 49 |
双线,test = 1,test++ | 49 |
双线,test++ | 71 |
根据上表的结果分析:在不共享资源的情况下,或者共享资源没有写操作的时候,单线程与双线程执行时间基本一样,但是在双线程共享一个变量,并且写变量的时候 ,运行速度下降特别多。
思考猜测:两个线程没有同时写操作一个资源时,应该是被分配在cpu的不同核心进行工作,但是同时写操作一个资源时,是在cpu的同一核心进行工作,需要不停的进行线程切换,所以速度并不是翻倍下降,而是下降很多。
上述问题还仅仅是猜测,平时使用多线程时,只停留在用的阶段上,对于cpu是如何调度线程的,线程之间的各种关系没有深入了解,后面查阅清楚了再来补充。
来源:CSDN
作者:MG芒果
链接:https://blog.csdn.net/qq_33485657/article/details/103937026