我运行的数据来自于卡方分布自动生成,原理同大样本的蒙特卡洛模拟,运行的是一元OLS回归命令。根据stata官网给出的测试结果,reg命令应有100%的并行率,使用多核计算应能极大提高运行速度。并行率数据:
https://www.stata.com/statamp/statamp_20210611.pdf
我的笔记本处理器是i5-1240p,有4大核和8小核,共12个物理核心,加上虚拟核心有16个处理器。
代码如下:
- cls
- clear
- set obs 1000
- g x=rchi2(1)
- g y=1+2*x+rchi2(10)-10
- timer clear
- forval i=1/10{
- timer on 65
- forval j=1/100{
- forval k=1/16{
- qui set processors `k'
- timer on `k'
- qui reg y x
- timer off `k'
- }
- }
- timer off 65
- qui timer list 65
- di "完成率" `i'*10 "%,累计用时为" r(t65)
- }
- forval k=1/16{
- qui timer list `k'
- di "使用`k'个处理器平均一次一元回归的用时为" r(t`k')/1000
- }
使用的是forval命令循环语句。
结果如下:
可以发现,stata在多处理器状态下对速度好像没有什么提升,平均速度反而是在下降。
为了排除stata越运行越慢这一可能性因素造成的影响,我对语句进行了如下修改:由先使用1个处理器计算变为先使用16个处理器计算,依次递减。依旧以使用16到1个处理器各进行一次回归为1轮,每进行100轮报告一次进度和累计时间。使用了暂元命令local和while命令,代码如下:
- cls
- clear
- set obs 1000
- g x=rchi2(1)
- g y=1+2*x+rchi2(10)-10
- timer clear
- forval i=1/10{
- timer on 65
- forval j=1/100{
- local k=16
- while `k'>0{
- qui set processors `k'
- timer on `k'
- qui reg y x
- timer off `k'
- local k=`k'-1
- }
- }
- timer off 65
- qui timer list 65
- di "完成率" `i'*10 "%,累计用时为" r(t65)
- }
- forval k=1/16{
- qui timer list `k'
- di "使用`k'个处理器平均一次一元回归的用时为" r(t`k')/1000
在第二次实验中,多处理器的平均计算速度依旧低于单处理器的计算速度,处理器越多速度反而越慢。或言之,通过set processors命令增加使用的处理器数量,似乎并不一定能增加运行速度。
那么,增加处理器数量以提速有怎样的前提条件?我是一名大三本科生,刚刚接触stata,很多原理还不甚了解。还请大佬予以指教和解答。
万分感谢!
更新:问题已经解决,增加处理器数量以提速的前提条件是计算量较大。推测的原因如下:
当多处理器运行时,调用数据所需的时间也多于单处理器,而其在计算量较小时节约的时间并不能弥补调用数据所额外耗费的时间。即在计算量较小时,单核或少核心有更快的数据调用速度、运行更快;在计算量较大时,多核有更快的计算速度、运行更快。
此外,最佳的处理器数量是物理核心的个数(包括大小核);在中等数据规模的情况下,设定处理器数量为大核(效率核心)的个数也表现不俗。
测试所用的代码如下:
- cls
- //reg命令在不同处理器使用数量下的运行速度
- //使用处理器:i5-1240P 1.70 GHz
- //状态:插电
- qui di c(current_date)
- qui di c(current_time)
- di "测试时间:`c(current_time)',`c(current_date)'"
- clear //清除数据
- set obs 2000 //设定样本量2000
- g y=rchi2(10)-10
- forval i=1/200{
- g x`i'=rchi2(1) //生成解释变量xi
- qui replace y=y+`i'*x`i' //生成解释变量
- }
- //计时运行部分
- timer clear
- forval i=1/10{
- forval j=1/5{
- forval k=1/16 {
- qui set processors `k' //调整使用处理器数量
- timer on 65 //开启总计时器
- timer on `k' //开启分计时器
- qui reg y x* //运行回归命令
- timer off `k' //关闭分计时器
- timer off 65 //关闭总计时器
- } //处理器数量递增运行
- local k=16
- while `k'>0{
- qui set processors `k' //调整使用处理器数量
- timer on 65 //开启总计时器
- timer on `k' //开启分计时器
- qui reg y x* //运行回归命令
- timer off `k' //关闭分计时器
- timer off 65 //关闭总计时器
- local k=`k'-1
- } //处理器数量递减运行
- }
- qui timer list 65
- di "完成率" `i'*10 "%,累计用时" r(t65) ",平均" r(t65)/(`i'*160)
- } //设置不同的处理器数量,计时运行命令100次
- //不同处理器数量下运行速度计算
- forval k=1/16{
- qui timer list `k' //储存计时数据
- di "使用`k'个处理器平均一次回归的用时为" r(t`k')/100 //求平均用时
- } //根据设置的不同处理器数量计算平均用时
如果继续扩大样本量(如30万个),12核速度会更快。


雷达卡




京公网安备 11010802022788号







