我有一个复杂的结构,驱动程序子程序调用多个用户库。需要传递许多论点。为了避免出错的可能性,我决定将参数打包在派生类型结构中并使用指针。我注意到这种包装大大减慢了。我用这两种选择做了一个有效的例子。 https://dl.dropboxusercontent.com/u/258337/stackoverflow/working_example.f90使用派生类型,而https://dl.dropboxusercontent.com/u/258337/stackoverflow/working_example_alt.f90直接传递参数。真实系统比这复杂得多,但这代表了所发生的事情。
我用-O2编译两者并用时间来衡量他们的表现:
$ ifort -O2 -o test working_example_alt.f90 && time ./test
real 0m0.769s
user 0m0.768s
sys 0m0.000s
$ ifort -O2 -o test working_example.f90 && time ./test
real 0m1.441s
user 0m1.444s
sys 0m0.000s
同样的减速也发生在gfortran上。我使用Linux Debian 7.0。
以下是一些分析示例(使用英特尔Vtune),显示原始系统的一个库内的延迟。小案: 更大的案例,同一个图书馆:
我预计会有一些开销,但不是那么重要......这是正常的吗?是由于每个司机呼叫时的指针关联?或者禁用了一些优化?或者只是传递派生类型而不是内在类型?联营公司的构建成本应该是多少?
这是https://software.intel.com/en-us/forums/topic/510037
上的交叉发布提前致谢,
答案 0 :(得分:1)
我不确定你在寻找答案的方面...我对fortran oop和指针的经验是,是的,这会导致一些相当大的开销。
我使用OOP为学生编写流体动力学代码 - 这是安全和可读的,这就是我使用OOP的原因。但是当我对代码进行分析时,我发现在代码的某些关键部分(迭代压力求解器)中取出指针引用使我的速度提高了两倍(运行时间缩短到4分钟)。
所以,添加.2s的指针似乎并不可能,但我不能说这是否是您提供的信息中唯一的问题。我想一个提示可能是用OOP开发(非常快速和安全),然后优化实际上对性能有影响的部分。