楼主: 凤歌陆接舆
3360 2

[数据管理求助] 增加使用的处理器数量可以提升运行stata运行速度吗? [推广有奖]

  • 0关注
  • 0粉丝

已卖:1份资源

高中生

17%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
48.3283
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
126 点
帖子
4
精华
0
在线时间
44 小时
注册时间
2022-5-14
最后登录
2025-5-26

楼主
凤歌陆接舆 发表于 2023-5-15 17:30:12 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在之前浏览有关提升stata运行速度的帖子时,我看到大多数用户说set processors [数值]这个命令可以通过增加使用的处理器数量来提升stata的运行速度,我就自己试了试,发现可能并非如此。
我运行的数据来自于卡方分布自动生成,原理同大样本的蒙特卡洛模拟,运行的是一元OLS回归命令。根据stata官网给出的测试结果,reg命令应有100%的并行率,使用多核计算应能极大提高运行速度。并行率数据:
https://www.stata.com/statamp/statamp_20210611.pdf
我的笔记本处理器是i5-1240p,有4大核和8小核,共12个物理核心,加上虚拟核心有16个处理器。
代码如下:
  1. cls
  2. clear
  3. set obs 1000
  4. g x=rchi2(1)
  5. g y=1+2*x+rchi2(10)-10

  6. timer clear
  7. forval i=1/10{
  8.         timer on 65
  9.         forval j=1/100{
  10.                 forval k=1/16{
  11.                 qui set processors `k'
  12.                 timer on `k'
  13.                 qui reg y x
  14.                 timer off `k'
  15.                 }
  16.         }
  17.         timer off 65
  18.         qui timer list 65
  19.         di "完成率" `i'*10 "%,累计用时为" r(t65)
  20. }

  21. forval k=1/16{
  22.         qui timer list `k'
  23.         di "使用`k'个处理器平均一次一元回归的用时为" r(t`k')/1000
  24. }
复制代码
代码的目标是让stata M/P在大致相同的情况下,以不同处理器数量各运行1000次reg命令,然后利用timer命令来求平均时长。以使用1到16个处理器各进行一次回归为1轮,每进行100轮报告一次进度和累计时间。最后统计在使用不同数量处理器下进行一次回归的平均用时。
使用的是forval命令循环语句。
结果如下:
Stata output_00(1).png
可以发现,stata在多处理器状态下对速度好像没有什么提升,平均速度反而是在下降。
为了排除stata越运行越慢这一可能性因素造成的影响,我对语句进行了如下修改:由先使用1个处理器计算变为先使用16个处理器计算,依次递减。依旧以使用16到1个处理器各进行一次回归为1轮,每进行100轮报告一次进度和累计时间。使用了暂元命令localwhile命令,代码如下:
  1. cls
  2. clear
  3. set obs 1000
  4. g x=rchi2(1)
  5. g y=1+2*x+rchi2(10)-10

  6. timer clear
  7. forval i=1/10{
  8.         timer on 65
  9.         forval j=1/100{
  10.                 local k=16
  11.                 while `k'>0{
  12.                 qui set processors `k'
  13.                 timer on `k'
  14.                 qui reg y x
  15.                 timer off `k'
  16.                 local k=`k'-1
  17.                 }
  18.         }
  19.         timer off 65
  20.         qui timer list 65
  21.         di "完成率" `i'*10 "%,累计用时为" r(t65)
  22. }

  23. forval k=1/16{
  24.         qui timer list `k'
  25.         di "使用`k'个处理器平均一次一元回归的用时为" r(t`k')/1000
复制代码
结果如下:
Stata output2_00.png
在第二次实验中,多处理器的平均计算速度依旧低于单处理器的计算速度,处理器越多速度反而越慢。或言之,通过set processors命令增加使用的处理器数量,似乎并不一定能增加运行速度。
那么,增加处理器数量以提速有怎样的前提条件?我是一名大三本科生,刚刚接触stata,很多原理还不甚了解。还请大佬予以指教和解答。
万分感谢!


更新:问题已经解决,增加处理器数量以提速的前提条件是计算量较大。推测的原因如下:
当多处理器运行时,调用数据所需的时间也多于单处理器,而其在计算量较小时节约的时间并不能弥补调用数据所额外耗费的时间。即在计算量较小时,单核或少核心有更快的数据调用速度、运行更快;在计算量较大时,多核有更快的计算速度、运行更快。
此外,最佳的处理器数量是物理核心的个数(包括大小核);在中等数据规模的情况下,设定处理器数量为大核(效率核心)的个数也表现不俗。
测试所用的代码如下:
  1. cls
  2. //reg命令在不同处理器使用数量下的运行速度
  3. //使用处理器:i5-1240P 1.70 GHz
  4. //状态:插电
  5. qui di c(current_date)
  6. qui di c(current_time)
  7. di "测试时间:`c(current_time)',`c(current_date)'"
  8. clear //清除数据
  9. set obs 2000 //设定样本量2000
  10. g y=rchi2(10)-10
  11. forval i=1/200{
  12.         g x`i'=rchi2(1) //生成解释变量xi
  13.         qui replace y=y+`i'*x`i' //生成解释变量
  14. }
  15. //计时运行部分
  16. timer clear
  17. forval i=1/10{
  18.         forval j=1/5{
  19.                 forval k=1/16 {
  20.                         qui set processors `k' //调整使用处理器数量
  21.                         timer on 65 //开启总计时器
  22.                         timer on `k' //开启分计时器
  23.                         qui reg y x* //运行回归命令
  24.                         timer off `k' //关闭分计时器
  25.                         timer off 65 //关闭总计时器
  26.                 } //处理器数量递增运行
  27.                 local k=16
  28.                 while `k'>0{
  29.                         qui set processors `k' //调整使用处理器数量
  30.                         timer on 65 //开启总计时器
  31.                         timer on `k' //开启分计时器
  32.                         qui reg y x* //运行回归命令
  33.                         timer off `k' //关闭分计时器
  34.                         timer off 65 //关闭总计时器
  35.                         local k=`k'-1
  36.                 } //处理器数量递减运行
  37.         }
  38.         qui timer list 65
  39.         di "完成率" `i'*10 "%,累计用时" r(t65) ",平均" r(t65)/(`i'*160)
  40. } //设置不同的处理器数量,计时运行命令100次
  41. //不同处理器数量下运行速度计算
  42. forval k=1/16{
  43.         qui timer list `k' //储存计时数据
  44.         di "使用`k'个处理器平均一次回归的用时为" r(t`k')/100 //求平均用时
  45. } //根据设置的不同处理器数量计算平均用时
复制代码
导出的结果如图所示: Stata output_00.png
如果继续扩大样本量(如30万个),12核速度会更快。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Stata tata 处理器 Processor Process Stata专版 运行速度慢 回归分析 软件测试 处理器

沙发
凤歌陆接舆 发表于 2023-5-16 08:37:00
其实可以把两次实验所用代码结合:
[code]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 1000 //设定样本量1000
g x1=rchi2(1) //生成解释变量x1
g x2=rchi2(1) //生成解释变量x2
g y=1+2*x1+3*x2+rchi2(10)-10 //生成被解释变量
//计时运行部分
timer clear
forval i=1/10{

藤椅
赵安豆 发表于 2025-9-6 15:31:49
增加处理器数量在理论上可以提升Stata的运行速度,但这主要适用于那些能够利用多线程处理的命令。对于像`reg`这样的命令,虽然Stata声称有100%的并行率,但实际应用中的效果可能受到多种因素的影响:

1. **数据集大小**:对于非常大的数据集或复杂的模型计算,增加处理器数量可能会带来明显速度提升。但对于较小的数据集或者简单的统计分析,多线程带来的性能增益可能并不显著。

2. **命令并行化程度**:即使Stata声称某些命令有较高的并行率,实际的并行处理效果还受到具体实现细节的影响。例如,`reg`命令虽然理论上可以充分利用多核处理器,但在处理特定类型的数据或模型时可能会受限于算法设计而不能完全发挥多线程优势。

3. **操作系统和硬件配置**:你的计算机操作系统、内存大小以及硬盘读写速度等都会影响到程序的运行效率。此外,不同处理器架构(如你提到的大核与小核)对Stata命令的影响也是一个复杂的因素。

4. **Stata版本和编译方式**:不同的Stata版本可能在多线程处理方面有所不同,使用64位版本并确保是Intel二进制版本可以更好地利用多核优势。

基于上述考虑,在你的具体场景中,如果数据集不是特别大且`reg`命令的计算复杂度不高,增加处理器数量可能不会显著提升运行速度。另外,使用`set processors [数值]`时需要注意,过高的数值可能会导致Stata占用过多系统资源而降低整体性能。

为了测试并行处理的实际效果,你可以尝试在不同处理器设置下运行相同的数据和命令,并记录时间进行对比分析。同时,确保实验环境一致性(比如关闭其他可能占用CPU的程序)以获取更准确的结果。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-9 08:59