Gab*_*el 4 fortran gprof intel-fortran
我有一些使用intel fortran编译器ifort编译的fortran代码.当我使用gprof进行配置文件测试时,我得到的大部分时间用于IO操作,我想找到文件的结尾,但我找不到更多关于此的文档:
index % time self children called name
<spontaneous>
[1] 20.6 0.07 0.00 _IO_wfile_seekoff [1]
-----------------------------------------------
<spontaneous>
[2] 20.6 0.07 0.00 sforcepf_ [2]
-----------------------------------------------
<spontaneous>
[3] 20.6 0.02 0.05 _IO_wfile_underflow [3]
0.01 0.04 258716/258717 strncmp [4]
-----------------------------------------------
0.00 0.00 1/258717 _IO_wdefault_doallocate [15]
0.01 0.04 258716/258717 _IO_wfile_underflow [3]
[4] 14.7 0.01 0.04 258717 strncmp [4]
0.04 0.00 3104592/3109256 strerror_r [5]
-----------------------------------------------
0.00 0.00 4664/3109256 __strcmp_sse42 [14]
0.04 0.00 3104592/3109256 strncmp [4]
[5] 11.8 0.04 0.00 3109256 strerror_r [5]
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
那么,问题是,这个IO是针对Linux,还是针对ifort,还是针对fortran?我正在尝试优化此代码,并且在google中找不到有关此条款的有用信息.
你写Fortran语句.英特尔Fortran编译器将这些语句转换为汇编程序,包括对系统函数的调用.例如,strncmp是一个ISO C标准函数来比较字符串的部分.因此,看起来您正在编写Fortran语句来比较字符串,而英特尔Fortran编译器正在调用现有函数来实现比较.其中一些系统功能本身将通过调用平台上提供的更基本功能来实现(部分).
gprof向您展示对编译产品中引用的函数的调用.您看到的大部分内容都特定于Linux I/O - 在Windows机器上,I/O将使用具有不同名称的类似功能.您看到的一些内容可能是英特尔编译器所特有的,所有英特尔编译器都使用相同的(英特尔创建的)功能进行某些操作,并且该功能使用特定于平台的低级功能.
除非你准备重写这些低级函数,并承担使用相同函数将其搞砸到其他程序的风险,否则你可以做的唯一优化就是不经常调用它们.例如,如果您有理由认为读取文件末尾是一项昂贵的I/O操作,并且您的程序策略是读取文件,直到您阅读结束然后处理出现的错误,那么你可能想要实施一个优秀的计划战略.这比重写低级I/O例程更容易,后者处理策略的后果.