Loops 如何将循环转换为向量赋值符号
如何转换这样的循环:Loops 如何将循环转换为向量赋值符号,loops,fortran,vectorization,Loops,Fortran,Vectorization,如何转换这样的循环: Do i = 2,101 a(i) = b(i) c(i-1) = d(i) + d(i-1) d(i) = e(i) + 12 Enddo a(2) = b(2) c(1) = d(2) + d(1) d(2) = e(2) + 12 a(3) = b(3) c(2) = d(3) + d(2) d(3) = e(3) + 12 a(4) = b(4) c(3) = d(4) + d(3) d(4) = e(4) + 12 在Fortran的向量
Do i = 2,101
a(i) = b(i)
c(i-1) = d(i) + d(i-1)
d(i) = e(i) + 12
Enddo
a(2) = b(2)
c(1) = d(2) + d(1)
d(2) = e(2) + 12
a(3) = b(3)
c(2) = d(3) + d(2)
d(3) = e(3) + 12
a(4) = b(4)
c(3) = d(4) + d(3)
d(4) = e(4) + 12
在Fortran的向量表示法中?很明显,我们可以拆分循环,并执行类似的操作
a(2:101) = b(2:101)
但最后两条语句相互依赖,因此这不会真正起作用。首先,仔细看看您的未矢量化循环。前几次迭代如下所示:
Do i = 2,101
a(i) = b(i)
c(i-1) = d(i) + d(i-1)
d(i) = e(i) + 12
Enddo
a(2) = b(2)
c(1) = d(2) + d(1)
d(2) = e(2) + 12
a(3) = b(3)
c(2) = d(3) + d(2)
d(3) = e(3) + 12
a(4) = b(4)
c(3) = d(4) + d(3)
d(4) = e(4) + 12
除非d
在代码的前面已经初始化,否则这可能会导致不可预测的行为(具体来说,d(2)
在d(2)
本身被分配之前用于计算c(1)
)
编辑:正如High Performance Mark所指出的,这篇文章的其余部分是不正确的。不管怎样,我还是把它留在这里作为参考 请注意,
c
依赖于d
,但d
不依赖于c
。因此,您可以按如下方式重写代码:
a(2: 101) = b(2: 101)
d(2: 101) = e(2: 101) + 12
c(1: 100) = d(2: 101) + d(1: 100)
这与mtrw的答案非常相似,但请注意最后一行中的+
而不是-
,以及c
的索引。通过写出循环的几次迭代得出了正确的想法<代码>c和d
更新为:
c(1) = d(2) + d(1)
d(2) = e(2) + 12
c(2) = d(3) + d(2) = d(3) + e(2) + 12
d(3) = e(3) + 12
c(3) = d(4) + d(3) = d(4) + e(3) + 12
d(4) = e(4) + 12
因此,c
的第N个值取决于d
的N+1st
值和e
的N
值。我们可以将整个循环编写为:
a(2:101) = b(2:101)
c(1) = d(2) + d(1)
c(2:100) = d(3:101) + e(2:100) + 12
d(2:101) = e(2:101) + 12
旧的
Do i = 2,101
a(i) = b(i)
c(i-1) = d(i) + d(i-1)
d(i) = e(i) + 12
Enddo
新的
a(2:101) = b(2:101)
c(1:100) = d(2:101) + d(1:100)
d(2:101) = e(2:101) + 12
如果这是任何更快,我怀疑它,它可能是更模糊的设计意图,所以矢量化可能并不总是最好的方式去
编辑1
a(2:101) = b(2:101)
d(2:101) = e(2:101) + 12
c(1:100) = d(2:101) + d(1:100)
因为
d
仅取决于e
,而c
取决于d
。从上面的循环d(1)
需要在前面定义。矢量化是什么意思?SIMD指令或只是在数组赋值符号中重写?我应该指定-只是重写它,没有SIMD stuffNotec
完全不依赖于e
。(目前的两个答案都是错误的.)@agentp-我认为c的第N个值取决于d
的N+1个值和e
的第N个值。看我的新答案。请不要转换!循环很好。但这是错误的,它将更新顺序翻转为d
和c
。由于对c
的更新取决于d
中的值,这是一个显著的变化。我的错。我修好了。Tx+1我认为在这种情况下,原文的可读性不太好,因为很多人很难理解它!我理解d(I)+d(I-1)
比d(2:101)+d(1:100)
好得多,这是错误的-c(I-1)取决于之前迭代中计算的d(I)。你写这些的方式不会尊重这种依赖@mtrw的答案是正确的——看看他是如何展开循环的。我也认为这是正确的方法,谢谢