Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何将循环转换为向量赋值符号_Loops_Fortran_Vectorization - Fatal编程技术网

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 stuffNote
c
完全不依赖于
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的答案是正确的——看看他是如何展开循环的。我也认为这是正确的方法,谢谢