在fortran代码的gprof输出上_IO_wfile是什么?

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中找不到有关此条款的有用信息.

Hig*_*ark 9

你写Fortran语句.英特尔Fortran编译器将这些语句转换为汇编程序,包括对系统函数的调用.例如,strncmp是一个ISO C标准函数来比较字符串的部分.因此,看起来您正在编写Fortran语句来比较字符串,而英特尔Fortran编译器正在调用现有函数来实现比较.其中一些系统功能本身将通过调用平台上提供的更基本功能来实现(部分).

gprof向您展示对编译产品中引用的函数的调用.您看到的大部分内容都特定于Linux I/O - 在Windows机器上,I/O将使用具有不同名称的类似功能.您看到的一些内容可能是英特尔编译器所特有的,所有英特尔编译器都使用相同的(英特尔创建的)功能进行某些操作,并且该功能使用特定于平台的低级功能.

除非你准备重写这些低级函数,并承担使用相同函数将其搞砸到其他程序的风险,否则你可以做的唯一优化就是不经常调用它们.例如,如果您有理由认为读取文件末尾是一项昂贵的I/O操作,并且您的程序策略是读取文件,直到您阅读结束然后处理出现的错误,那么你可能想要实施一个优秀的计划战略.这比重写低级I/O例程更容易,后者处理策略的后果.