我有一个fortran90代码要优化。现在,我想访问外部循环中结构的内存位置,然后访问嵌套循环中最深的结构。就像这样:
示例fortran循环-遗留版本
do i = 1, N
ii = some integer
jj = some other integer
do j = 1, M
c = a(ii, jj)%b(i)
enddo
enddo必须成为:
第二个fortran循环-我想写什么
do i = 1, N
ii = some integer
jj = some other integer
pointertoa = &a(ii, jj) !I know it's not correct in fortran, that is the question!
do j = 1, M
c = pointertoa%b(i)
enddo
enddo我让这个(样例)C代码像我所期望的那样工作:
C语言工作记忆寻址
#include <stdio.h>
struct mem{
int a;
struct mm{
int b;
float v;
} mmm;
};
void main(){
struct mem *m, dum;
dum.a = 12;
dum.mmm.b = 5;
dum.mmm.v = 3.2;
m = &dum; //m is given dum memory address
printf("dum.a = %d\n", dum.a);
printf("dum.mmm.b = %d\n", dum.mmm.b);
printf("dum.mmm.v = %f\n", dum.mmm.v);
printf("m.a = %d\n", m->a);
printf("m.mmm.b = %d\n", m->mmm.b);
printf("m.mmm.v = %f\n", m->mmm.v);
}有几个问题:
发布于 2014-10-13 11:57:13
Fortran会使您很难获得变量的内存地址或其他任何相关内容。在Fortran中,您可能在C中学到的技巧和技巧,在指针和内存地址上乱七八糟,只是不受支持。一般来说,在Fortran的核心应用程序域中也不需要它们。你的问题更像是在用Fortran写C。别。
现在我已经说清楚了,您可以使用最近引入的associate结构来实现您想要的结果。有点像
associate(pointertoa => a(ii, jj))
do j = 1, M
c = pointertoa%b(i)
enddo
end associate不管这是否达到了你的效率目标,我没有史酷比。但如果是的话我会很惊讶的。优化对数组元素的访问是Fortran编译器多年来一直致力于的事情,他们在这方面非常擅长。
编辑,回应OP的第一条评论.
如果您的编译器支持associate,那么当然可以使用它。但是,如果有人在你的肩膀上看了看,如果你使用了90标准发布后引入Fortran的任何功能,就会痛苦地打你的头,那么你是否会受到打击取决于你。编译器不会在意,编译后的代码也不会在意。associate是标准的一部分,而Fortran在保持向后兼容性方面有很好的记录,因此将来编译器不高兴的可能性非常小。
在编写C函数时,不要忘记利用循环展开、内存预取、多指令管道、向量操作、公共子表达式消除等诸如此类的优点。如果您能够编写一个性能优于Fortran编译器的产品的C函数,优化结果为11,请返回数据以证明这一点,我会吃了一惊。
当我再次写作的时候,我注意到循环
do j = 1, M
c = pointertoa%b(i)
enddo几乎是完全多余的,一个好的优化编译器只需创建一次执行c = pointertoa%b(i)的代码。
https://stackoverflow.com/questions/26338760
复制相似问题