【发布时间】:2014-10-13 11:19:15
【问题描述】:
我有一个 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);
}
几个问题:
- 你会如何做我在 fortran90 中用 C 做的同样的事情?
- 您认为第二个 fortran 循环会加快代码速度吗?
【问题讨论】:
-
关于(2)如何加速代码?
-
Fortran 中的指针由
=>设置,而不是&! -
@JohnZwinck,加速将是一种预取:您可以看到
ii和jj索引存储在外部循环中,所以它会是很明显在同一个地方加载a(ii, jj)。 @AlexanderVogt,指针根本行不通,因为我需要 a(ii, jj) 在内部循环中的内存位置,而不是对其值的引用-无论如何,我尝试在 C 代码中使用指针,得到一个设置错误:)。 -
@bio,编译器并不笨,首先证明这确实会减慢代码速度,然后才能优化。
-
好吧,我说的似乎不正确:我得到 seg 错误的原因是我在写
*m = dum之前没有分配*m。此代码产生正确的输出:m = malloc(sizeof (struct mem)); *m = dum;谢谢!
标签: c pointers fortran90 memory-address