zzgjtx 发表于 2016-9-23 12:55:01

关于调试的问题

编译环境:IVF Compiler XE 14.0.1.139
系统: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:43

关于VS速度很慢的问题,我想很少有人会回答。
试试用命令行编译吧。

pasuka 发表于 2016-9-23 16:01:58

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:59

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 ...
1>Larg_Stiffness_R.f90
1>Larg_Stiffness_L.f90
1>Larg_Stiffness.f90
1>Main_Cal.f90

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

zzgjtx 发表于 2016-9-23 19:38:29

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

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

kerb 发表于 2016-9-23 21:54:36

把matmul换成dgemm试一下

pasuka 发表于 2016-9-24 08:08:21

zzgjtx 发表于 2016-9-23 19:38
谢谢。
配置没您说的那么高,我的代码都在300行左右,我试试换别的机器试试
...

另外一种可能是数组越界或者代码本身有error,但是debug状态下有些编译检查关闭

zzgjtx 发表于 2016-9-24 08:21:07

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

谢谢,问题已解决。
我尝试了在调试或者运行前,对解决方案进行代码分析,然后我提出的问题就解决了。
但是还是不明白其中道理,有兴趣可以继续探讨。

pasuka 发表于 2016-9-24 09:04:40

zzgjtx 发表于 2016-9-24 08:21
谢谢,问题已解决。
我尝试了在调试或者运行前,对解决方案进行代码分析,然后我提出的问题就解决了。
但 ...

也许真的是VS的问题,命令行编译应该会快很多

pasuka 发表于 2016-9-24 09:13:22

kerb 发表于 2016-9-23 21:54
把matmul换成dgemm试一下

编译命令加上-fexternal-blas -fblas-matmul-limit-finline-matmul-limit就行,何必改动源代码呢
页: [1] 2
查看完整版本: 关于调试的问题