Parallel processing 循环倾斜如何使循环可并行化?

Parallel processing 循环倾斜如何使循环可并行化?,parallel-processing,nested-loops,skew,Parallel Processing,Nested Loops,Skew,我正在阅读有关循环转换技术的书籍,我很难理解循环倾斜是如何使循环可并行的。这里有两个循环,第一个和第二个,这两个之间有什么区别?它们两个都依赖于i和j的上一次迭代,是什么使得第二个循环可以并行?或者为什么我们可以在第二个而不是第一个上进行交换?它们都依赖于i和j for(int i =2; i < 5; i++){ for(int j =2; j < 5; j++){ A[i][j] = A[i-1][j] + A[i][j-1

我正在阅读有关循环转换技术的书籍,我很难理解循环倾斜是如何使循环可并行的。这里有两个循环,第一个和第二个,这两个之间有什么区别?它们两个都依赖于i和j的上一次迭代,是什么使得第二个循环可以并行?或者为什么我们可以在第二个而不是第一个上进行交换?它们都依赖于i和j

for(int i =2; i < 5; i++){
            for(int j =2; j < 5; j++){
                A[i][j] = A[i-1][j] + A[i][j-1];
            }
        }
for(int i =2; i < 5; i++){
            for(int j =2+i; j < 5+i; j++){
                A[i][j-i] = A[i-1][j-i] + A[i][j-1-i];
            }
        }
for(int i=2;i<5;i++){
对于(int j=2;j<5;j++){
A[i][j]=A[i-1][j]+A[i][j-1];
}
}
对于(int i=2;i<5;i++){
对于(int j=2+i;j<5+i;j++){
A[i][j-i]=A[i-1][j-i]+A[i][j-1-i];
}
}

我对此没有信用,我只是为您格式化并从另一个来源复制了它,我希望它能帮助您

[来源:

这都是关于两个执行迭代之间的距离,在第一个迭代中,一个外部循环和内部循环之间的距离是1,因此它们之间存在依赖关系

循环倾斜完全按照它所说的做:它倾斜内部循环的执行 相对于外部循环。如果内部循环依赖于外部循环,从而阻止其并行运行,则此选项非常有用。例如,以下代码的依赖向量为{(1,0),(0,1)}。两个循环都不能并行 因为它们每个都有一个依赖项。简单地交换循环只会 交换包含依赖项的索引,但一事无成

do i = 2, n-1
do j = 2, m-1
a[i,j] =
      (a[a-1,j] + a[i,j-1] + a[i+1,j] + a[i,j+1]) / 4
end do
end do
循环倾斜是通过添加外部循环的索引来实现的 将倾斜因子f设置为内循环的边界,并减去相同的值 从所有使用的内部循环索引。减法使索引保持在 新的循环边界,保持了程序的正确性 内循环迭代是将它们在数组中的位置向前移动f相对值 到当前外部循环,增加到外部循环的依赖关系距离 换句话说,给定一个依赖向量(a,b),歪斜 将其转换为(a,fa+b)。因为此转换保留了词典的 依赖项的顺序始终是合法的。将倾斜因子应用于 上面的内部循环生成以下代码:

do i = 2, n-1
do j = 2+i, m-1+i
a[i,j-i] =
(a[a-1,j-i] + a[i,j-1-i] + a[i+1,j-i] + a[i,j+1-i]) / 4
end do
end do
do j = 4, m+n-2
do i = max(2, j-m+1), min(n-1, j-2)
a[i,j-i] =
(a[a-1,j-i] + a[i,j-1-i] + a[i+1,j-i] + a[i,j+1-i]) / 4
end do
end do
这段新代码以相同的方式执行,但依赖项为{(1,1),(0,1)}。两个循环仍然带有依赖项。但是,在这一点上交换循环会产生依赖向量{(1,0),(1,1)},如下代码所示:

do i = 2, n-1
do j = 2+i, m-1+i
a[i,j-i] =
(a[a-1,j-i] + a[i,j-1-i] + a[i+1,j-i] + a[i,j+1-i]) / 4
end do
end do
do j = 4, m+n-2
do i = max(2, j-m+1), min(n-1, j-2)
a[i,j-i] =
(a[a-1,j-i] + a[i,j-1-i] + a[i+1,j-i] + a[i,j+1-i]) / 4
end do
end do
内部循环现在可以并行化,因为它现在没有对j的循环依赖,而对i的依赖由外部循环进行 交换倾斜循环边界不再简单:每个循环必须
考虑到另一个循环的上下限。

谢谢你的评论,我用原始来源的链接更新了答案。我不想让提问者感到困惑,并为他提取了刚刚需要的信息。