Fortran Coder

标题: 关于调试的问题 [打印本页]

作者: zzgjtx    时间: 2016-9-23 12:55
标题: 关于调试的问题
编译环境:IVF Compiler XE 14.0.1.139 [Intel(R) 64]
系统:Win 10
Visual 版本  Visual_Studio_Ultimate_2012

问题描述:
程序共包括五个子程序
  <Call fn0(fn,ak)                   !积分点
  Call Get_mass_matirx(n, fn, ak,gama,lamda_all,B0,M_sum)   !质量矩阵
  Call Assem_Stiff_Sub(n, fn, ak, gama,lamda_all,B0,DK_sum)  !刚度矩阵
  Call Stiff_Pen_Sub(n,fn,ak,gama,lamda_all,B0,K_pen)             !修正矩阵
  Call Stiff_Larg_Sub(n,fn,ak,gama,lamda_all,B0,K_Larg)>         !修正矩阵

其中修正矩阵下,又分别调用子程序,以子程序Assem_Stiff_Sub为例,其又调用了子程序Stiff_Chev_ds_RBC
Subroutine Assem_Stiff_Sub(n,fn,ak,gama,lamda_all,B0,DK_sum)
******
程序内容省略
*****
Do k = 1, n
     Do j = 1, n
     Do i = 1, n
     call Stiff_Chev_ds_RBC(fn(i),fn(j),fn(k),gama,lamda_all,B0,KUU_R,KUV_R,KUW_R,KVV_R,KVW_R,KWW_R)
     **********(该部分是对传入和返回值的计算,太多略去)
     End Do
     End Do
  End Do
(该段下文取名为A程序段)
******
程序内容省略
*****End Subroutine Assem_Stiff_Sub

遇到的问题是,编译正常,当主程序中发生参数改动时,调试、生成均变得非常慢。
经过摸索,发现通过把 调用子程序的A程序段注释掉,然后调试或者启动(debug)就很快显示linking, 说明能正常计算了。
然后取消生成,再把A程序段注释取消,此后再调试或者运行就很快能linking,能正常计算。

在程序中只调用了内置函数,transpose和matmul,其余函数都是自己编程实现,没有再调用其他函数库。
尝试了很多设置,未能彻底解决此问题,只能用我上述那种笨办法,每改变一次参数,重复前述操作。
所以在此向各位前请教,望不吝指教。谢谢。


作者: fcode    时间: 2016-9-23 14:28
关于VS速度很慢的问题,我想很少有人会回答。
试试用命令行编译吧。
作者: pasuka    时间: 2016-9-23 16:01
fcode 发表于 2016-9-23 14:28
关于VS速度很慢的问题,我想很少有人会回答。
试试用命令行编译吧。

单个文件代码行数超过四位数的话,肯定快不起来
VS和IVF支持并行编译,类似于make -job=XX命令
lz最好确定,编译环境的硬件与软件都能达到state of the art,英特尔四核cpu+16G内存 + 64位OS + VS和IVF最新版
作者: zzgjtx    时间: 2016-9-23 19:31
fcode 发表于 2016-9-23 14:28
关于VS速度很慢的问题,我想很少有人会回答。
试试用命令行编译吧。

谢谢。不是VS本身速度慢。

当注释掉那一段包含调用的程序,运行和调试都正常。
然后再取消注释,原程序运行和调试也都正常。

搞不明白,为什么直接调试就不可以。昨晚又试了一下,一晚上显示:
1>------ 已启动生成: 项目: Hybrid_vara_thick_plate_analysis, 配置: Debug x64 ------
1>Compiling with Intel(R) Visual Fortran Compiler XE 14.0.1.139 [Intel(R) 64]...
1>Larg_Stiffness_R.f90
1>Larg_Stiffness_L.f90
1>Larg_Stiffness.f90
1>Main_Cal.f90

虽然现在用我帖子里的办法能运行,但是还是纠结。

作者: zzgjtx    时间: 2016-9-23 19:38
pasuka 发表于 2016-9-23 16:01
单个文件代码行数超过四位数的话,肯定快不起来
VS和IVF支持并行编译,类似于make -job=XX命令
lz最好确定 ...

谢谢。
配置没您说的那么高,我的代码都在300行左右,我试试换别的机器试试

作者: kerb    时间: 2016-9-23 21:54
把matmul换成dgemm试一下
作者: pasuka    时间: 2016-9-24 08:08
zzgjtx 发表于 2016-9-23 19:38
谢谢。
配置没您说的那么高,我的代码都在300行左右,我试试换别的机器试试
...

另外一种可能是数组越界或者代码本身有error,但是debug状态下有些编译检查关闭
作者: zzgjtx    时间: 2016-9-24 08:21
pasuka 发表于 2016-9-24 08:08
另外一种可能是数组越界或者代码本身有error,但是debug状态下有些编译检查关闭 ...

谢谢,问题已解决。
我尝试了在调试或者运行前,对解决方案进行代码分析,然后我提出的问题就解决了。
但是还是不明白其中道理,有兴趣可以继续探讨。
作者: pasuka    时间: 2016-9-24 09:04
zzgjtx 发表于 2016-9-24 08:21
谢谢,问题已解决。
我尝试了在调试或者运行前,对解决方案进行代码分析,然后我提出的问题就解决了。
但 ...

也许真的是VS的问题,命令行编译应该会快很多
作者: pasuka    时间: 2016-9-24 09:13
kerb 发表于 2016-9-23 21:54
把matmul换成dgemm试一下

编译命令加上-fexternal-blas -fblas-matmul-limit  -finline-matmul-limit就行,何必改动源代码呢
作者: zzgjtx    时间: 2016-9-24 11:22
pasuka 发表于 2016-9-24 09:13
编译命令加上-fexternal-blas -fblas-matmul-limit  -finline-matmul-limit就行,何必改动源代码呢 ...

,谢谢指点,我试试,试了效果后我会再反馈。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2