首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fortran90:寻址内存位置

fortran90:寻址内存位置
EN

Stack Overflow用户
提问于 2014-10-13 11:19:15
回答 1查看 880关注 0票数 0

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

示例fortran循环-遗留版本

代码语言:javascript
复制
do i = 1, N
  ii = some integer
  jj = some other integer
  do j = 1, M
    c = a(ii, jj)%b(i)
  enddo
enddo

必须成为:

第二个fortran循环-我想写什么

代码语言:javascript
复制
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语言工作记忆寻址

代码语言:javascript
复制
#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);

}

有几个问题:

  1. 在fortran90中,你如何做到我在C语言中所做的那样?
  2. 你认为第二个fortran循环会加速代码吗?
EN

回答 1

Stack Overflow用户

发布于 2014-10-13 11:57:13

Fortran会使您很难获得变量的内存地址或其他任何相关内容。在Fortran中,您可能在C中学到的技巧和技巧,在指针和内存地址上乱七八糟,只是不受支持。一般来说,在Fortran的核心应用程序域中也不需要它们。你的问题更像是在用Fortran写C。别。

现在我已经说清楚了,您可以使用最近引入的associate结构来实现您想要的结果。有点像

代码语言:javascript
复制
  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,请返回数据以证明这一点,我会吃了一惊。

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

代码语言:javascript
复制
  do j = 1, M
    c = pointertoa%b(i)
  enddo

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26338760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档