gfortran“-march = haswell”慢于“-march = core2”

时间:2015-03-23 14:21:13

标签: performance gcc x86 gfortran

我在配备Intel Core i5-4570(Haswell)的64位Windows 7计算机上运行gfortran 4.9.2。我在同一台机器上编译和执行。

编译我的代码(科学模拟)
gfortran -frecord-marker-4 -fno-automatic -O3 -fdefault-real-8 (...)
         -Wline-truncation -Wsurprising -ffpe-trap=invalid,zero,overflow (...)
         -march=core2 -mfpmath=sse -c

比使用

编译快约30%
gfortran -frecord-marker-4 -fno-automatic -O3 -fdefault-real-8 (...)
         -Wline-truncation -Wsurprising -ffpe-trap=invalid,zero,overflow (...)
         -march=haswell -mfpmath=sse -c

-march=native给出与-march=haswell)相同的结果。

这对我来说很奇怪/奇怪,因为我希望有更多的指令可以使代码更快,而不是更慢。

首先:这是一台新机器,在工作中取代旧机器,不幸的是:

  • 我无法再使用之前的处理器进行测试
  • 我很难用另一个gfortran版本测试

现在,我使用gprof和不同的-march=设置进​​行了一些分析(请参阅gcc online listing)。在这个测试中:

  • core2nehalemwestmere全部导致~85s
  • sandybridge开始(添加AVX指令集),执行时间跳转到122s(haswell为128s)。

以下是报告的配置文件,按功能切换> 1.0s自我时间。

-march=core2的平面个人资料:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
  8.92      6.18     6.18                             __sinl_internal
  8.50     12.07     5.89                             __cosl_internal
  7.26     17.10     5.03                             _mcount_private
  6.42     21.55     4.45                             exp
  6.41     25.99     4.44                             exp2l
  5.08     29.51     3.52                             __fentry__
  3.71     32.08     2.57 35922427     0.07     0.18  predn_
  3.53     34.53     2.45                             log2l
  3.36     36.86     2.33 79418108     0.03     0.03  vxs_tvxs_
  2.90     38.87     2.01 97875942     0.02     0.02  rk4m_
  2.83     40.83     1.96   403671     4.86    77.44  radarx_
  2.16     42.33     1.50  4063165     0.37     0.43  dchdd_
  2.14     43.81     1.48                             pow
  2.11     45.27     1.46  8475809     0.17     0.27  aerosj_
  2.09     46.72     1.45 23079874     0.06     0.06  snrm2_
  1.86     48.01     1.29                             cos
  1.80     49.26     1.25                             sin
  1.75     50.47     1.21 15980084     0.08     0.08  sgemv_
  1.66     51.62     1.15 61799016     0.02     0.05  x2acc_
  1.64     52.76     1.14 43182542     0.03     0.03  atmostd_
  1.56     53.84     1.08 24821235     0.04     0.04  axb_
  1.53     54.90     1.06 138497449     0.01     0.01  axvc_

-march=haswell的平面个人资料:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
  6.49      6.71     6.71                             __sinl_internal
  6.05     12.96     6.25                             __cosl_internal
  5.55     18.70     5.74                             _mcount_private
  5.16     24.03     5.33                             exp
  5.14     29.34     5.31                             cos
  4.87     34.37     5.03                             sin
  4.67     39.20     4.83                             exp2l
  4.55     43.90     4.70 35922756     0.13     0.34  predn_
  4.38     48.43     4.53  8475884     0.53     0.69  aerosj_
  3.72     52.27     3.84                             pow
  3.43     55.82     3.55                             __fentry__
  2.79     58.70     2.88   403672     7.13   120.62  radarx_
  2.64     61.43     2.73 79396558     0.03     0.03  vxs_tvxs_
  2.36     63.87     2.44                             log2l
  1.95     65.89     2.02 97881202     0.02     0.02  rk4m_
  1.80     67.75     1.86 12314052     0.15     0.15  axs_txs_
  1.74     69.55     1.80  8475848     0.21     0.66  mvpd_
  1.72     71.33     1.78 36345392     0.05     0.05  gauss_
  1.53     72.91     1.58 25028687     0.06     0.06  aescudi_
  1.52     74.48     1.57 43187368     0.04     0.04  atmostd_
  1.44     75.97     1.49 23077428     0.06     0.06  snrm2_
  1.43     77.45     1.48 17560212     0.08     0.08  txs_axs_
  1.38     78.88     1.43  4062635     0.35     0.42  dchdd_
  1.36     80.29     1.41                             internal_modf
  1.30     81.63     1.34 61800367     0.02     0.06  x2acc_
  1.26     82.93     1.30                             log
  1.25     84.22     1.29 138497176     0.01     0.01  axvc_
  1.24     85.50     1.28 15978523     0.08     0.08  sgemv_
  1.10     86.64     1.14 10707022     0.11     0.11  ec_txs_
  1.09     87.77     1.13  8475648     0.13     0.21  g_eval_
  1.06     88.87     1.10                             __logl_internal
  0.98     89.88     1.01 17765874     0.06     0.07  solgeo_
  0.98     90.89     1.01 15978523     0.06     0.06  sger_

你会注意到-haswell基本上所有东西看起来都比较慢(甚至像sin / cos / exp这样的内部函数!)。

我可以举一个代码示例,函数vxs_tvxs,消耗2.73秒vs 2.33s:

  SUBROUTINE VXS_TVXS(VXS,TVXS)

  REAL VXS(3),TVXS(3,3)

  VTOT=sqrt(sum(VXS**2))
  VH=sqrt(VXS(1)**2+VXS(2)**2)

  if (VTOT==0.) then
    print*,'PB VXS_TVXS : VTOT=',VTOT
    stop
  endif

  sg=-VXS(3)/VTOT
  cg=VH/VTOT
  if (VH==0.) then
    sc=0.
    cc=1.
  else
    sc=VXS(2)/VH
    cc=VXS(1)/VH
  endif

  TVXS(1,:)=(/ cg*cc, cg*sc, -sg/)
  TVXS(2,:)=(/   -sc,    cc,  0./)
  TVXS(3,:)=(/ sg*cc, sg*sc,  cg/)

  RETURN
  END

对我来说似乎是一个无害的功能...

我做了一个非常简单的程序

PROGRAM PIPO
REAL VXS0(3),VXS(3),TVXS(3,3)
VXS0=(/50.,100.,200./)
VXS=VXS0
call cpu_time(start)
do k=1,50 000 000
  call VXS_TVXS(VXS,TVXS)
  VXS=0.5*(VXS0+TVXS(1+mod(k,3),:))
  VXS=cos(VXS)
enddo
call cpu_time(finish)
print*,finish-start,VXS
END

不幸的是,在此测试用例中,所有-march设置的结果大致相同。

所以我真的不知道发生了什么......另外,正如我们从之前的资料中看到的那样,甚至内部函数花费更多的事实也让人感到非常困惑。

0 个答案:

没有答案