C fortran90:寻址内存位置

C fortran90:寻址内存位置,c,pointers,fortran90,memory-address,C,Pointers,Fortran90,Memory Address,我有一个fortran90代码要优化。 现在我想访问外部循环中结构的内存位置,然后访问嵌套循环中最深的结构。 大概是这样的: fortran循环示例-旧版 必须成为: 第二个fortran循环-我想写的 我有这个(示例)C代码按照我的预期工作: C语言中的工作存储器寻址 #包括 结构成员{ INTA; 结构毫米{ int b; 浮动v; }嗯,; }; void main(){ 结构mem*m,dum; dum.a=12; dum.mmm.b=5; dum.mmm.v=3.2; m=&dum;/

我有一个fortran90代码要优化。 现在我想访问外部循环中结构的内存位置,然后访问嵌套循环中最深的结构。 大概是这样的:

fortran循环示例-旧版 必须成为:

第二个fortran循环-我想写的 我有这个(示例)C代码按照我的预期工作:

C语言中的工作存储器寻址
#包括
结构成员{
INTA;
结构毫米{
int b;
浮动v;
}嗯,;
};
void main(){
结构mem*m,dum;
dum.a=12;
dum.mmm.b=5;
dum.mmm.v=3.2;
m=&dum;//m是给定的dum内存地址
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);
}
有几个问题:

  • 你会怎么做我在fortran90中在C中做的那样
  • 你认为第二个fortran循环会加速代码吗

  • Fortran将使您很难获取变量的内存地址或其他任何相关信息。在C语言中学习到的技巧和技巧,比如指针和内存地址,在Fortran语言中是不受支持的。通常,Fortran的核心应用程序域也不需要它们。你的问题表明你正试图用Fortran编写C语言。不要

    现在我已经说出了这一点,您可以使用最近引入的
    associate
    构造来实现您想要的。差不多

      associate(pointertoa => a(ii, jj)) 
      do j = 1, M
        c = pointertoa%b(i)
      enddo
      end associate
    
    这是否达到了你的效率目标,我没有一个史酷比。但如果真是这样,我会很惊讶。优化对数组元素的访问是Fortran编译器50多年来一直致力于的事情,他们在这方面非常擅长

    编辑,回应OP的第一条评论

    如果您的编译器支持
    associate
    ,您当然可以使用它。但是,如果在90标准发布后,如果你使用Fortran中引入的任何功能,有人会从你的肩膀上看过去,狠狠地打你的头,那么你是否会受到打击取决于你自己。编译器不会在意,编译后的代码也不会在意
    associate
    是标准的一部分,Fortran在保持向后兼容性方面有很好的记录,因此未来编译器不安的可能性很小

    在编写C函数时,别忘了利用循环展开、内存预取、多指令管道、向量操作、公共子表达式消除等等。如果你能写一个C函数,它的性能超过Fortran编译器的产品,优化结果达到了11,那么带着数据回来证明它,我就要吃我的帽子了

    当我再次写作时,我注意到循环

      do j = 1, M
        c = pointertoa%b(i)
      enddo
    

    几乎是完全冗余的,一个好的优化编译器只需创建代码来执行一次
    c=pointertoa%b(i)

    Fortran将使您很难获取变量的内存地址或其他相关信息。在C语言中学习到的技巧和技巧,比如指针和内存地址,在Fortran语言中是不受支持的。通常,Fortran的核心应用程序域也不需要它们。你的问题表明你正试图用Fortran编写C语言。不要

    现在我已经说出了这一点,您可以使用最近引入的
    associate
    构造来实现您想要的。差不多

      associate(pointertoa => a(ii, jj)) 
      do j = 1, M
        c = pointertoa%b(i)
      enddo
      end associate
    
    这是否达到了你的效率目标,我没有一个史酷比。但如果真是这样,我会很惊讶。优化对数组元素的访问是Fortran编译器50多年来一直致力于的事情,他们在这方面非常擅长

    编辑,回应OP的第一条评论

    如果您的编译器支持
    associate
    ,您当然可以使用它。但是,如果在90标准发布后,如果你使用Fortran中引入的任何功能,有人会从你的肩膀上看过去,狠狠地打你的头,那么你是否会受到打击取决于你自己。编译器不会在意,编译后的代码也不会在意
    associate
    是标准的一部分,Fortran在保持向后兼容性方面有很好的记录,因此未来编译器不安的可能性很小

    在编写C函数时,别忘了利用循环展开、内存预取、多指令管道、向量操作、公共子表达式消除等等。如果你能写一个C函数,它的性能超过Fortran编译器的产品,优化结果达到了11,那么带着数据回来证明它,我就要吃我的帽子了

    当我再次写作时,我注意到循环

      do j = 1, M
        c = pointertoa%b(i)
      enddo
    

    几乎是完全冗余的,一个好的优化编译器只需创建代码来执行一次
    c=pointertoa%b(i)

    Fortran将使您很难获取变量的内存地址或其他相关信息。在C语言中学习到的技巧和技巧,比如指针和内存地址,在Fortran语言中是不受支持的。通常,Fortran的核心应用程序域也不需要它们。你的问题表明你正试图用Fortran编写C语言。不要

    现在我已经说出了这一点,您可以使用最近引入的
    associate
    构造来实现您想要的。差不多

      associate(pointertoa => a(ii, jj)) 
      do j = 1, M
        c = pointertoa%b(i)
      enddo
      end associate
    
    这是否达到了你的效率目标,我没有一个史酷比。但如果真是这样,我会很惊讶。优化对数组元素的访问是Fortran编译器50多年来一直致力于的事情,他们在这方面非常擅长

    编辑,回应OP的第一条评论

    如果你的