概述
- 目录
-
前言
一、依赖分析
二、依赖关系
1.基本概念
2.疑难点---真依赖与反依赖的关系
三.循环依赖分析
循环传递依赖
循环独立依赖
-
前言
网上关于这部分的内容少之又少,或许可以说没有。
研究生开了这门课,自己对这部分有部分理解分享给大家,若有不足之处请指证。
话不多说,直接上干货
提示:以下是本篇文章正文内容,下面案例可供参考
在依赖关系分析中都是对相同的变量进行讨论。
一、依赖分析
依赖分析的目标是发现是否有可以并行执行的代码段。
依赖分析不仅适用于共享存储并行编程,也适用于消息传递并行编程。
二、依赖关系
1.基本概念
S1:x=2
S2: y=x
S3: y=x+z
S4: z=6
这里首先要区分好什么是写入,什么是读取。(通俗点,一般在等号左边是写入,等号右边是读取)
1.真依赖为先写后读,S1先写入S2后读取。S1是数据的产生者,S2是数据的消费者。S1中的x是写入,S2中的y=x是依赖于S1,因为先有S1中的x才有S2中的y。
故在这里,S2依赖于S1,S1->TS2故为真依赖。
2.反依赖为先读后写,如S3和S4语句中的z变量,在S3语句中的z先被读取,在S4中被写入,故S3->AS4。
3.输出依赖,这个关系一般比较少见,如S2和S3中的y变量,他在两个语句中都是写的状态,故为输出依赖,S2->OS3。
2.疑难点---真依赖与反依赖的关系
其实真依赖与反依赖是一种相反的状态,只不过是语句出现的先后顺序而已(如:S2->AS1,S4->TS3)那么这样的话,我们该怎么写呢。
首先遵循一个原则,变量的复现,就是说你在其他语句中也看到了这个字母。
其次找出这两个语句,根据理解,找出依赖关系,比如说(S2中的x就依赖于S1,S3中的z就依赖于S4中的z)
当你找到依赖关系,你可以先写成真依赖的关系,也就是说,A依赖于B,那么此时的箭头指向就是B->A,当你写好后,检查一下,B中的该变量和A中的该变量是否为先写后读的关系,若是,则真依赖,否则反依赖。
那么反依赖刚好相反,A依赖于B,A->B,此时再判断A中的该变量和B中的该变量是否为先写后读的关系,若是,则真依赖,否则反依赖。
三.循环依赖分析
循环传递依赖:一次迭代中的语句与另一次迭代中的语句之间存在的依赖关系。
循环独立依赖:循环迭代内部语句之间存在的依赖关系。
大家看完概念是不是一脸懵逼,这啥玩意,别急,我们上例子。
for (i=1;i<=N;i++){
for(j=1;j<=N;j++){
S1: a[i][j] = b[i][j] + c[i][j]
S2: b[i][j] = a[i-1][j-1]
S3: c[i][j] = a[i][j]
}
}
首先我们来看两个名词,所谓传递,就像个传送带一样,得有+1或者-1的关系。所谓独立,就是和其他的东西没有关系,他自己玩自己的。
根据上面的代码,可以看到a变量的i和j都发生了变化,对于这种题,首先你就要进行代值写出来,我们先来看关于循环i,j
当i=2,j=2时
a[2][2]=b[2][2]+c[2][2]
b[2][2]=a[1][1]
c[2][2]=a[2][2]
当i=3,j=3时
a[3][3]=b[3][3]+c[3][3]
b[3][3]=a[2][2]
c[3][3]=a[3][3]
循环传递依赖
首先我们来找复现,可以找到i=2,j=2时,a[2][2]和i=3,j=3时,a[2][2]有复现。
其次我们来分析他们的依赖关系,S1中的a[2][2]是因为b[2][2],c[2][2]得来的,b[2][2]是因为上一次循环中的a[1][1]赋值给他的。再来看i=3时,b[3][3]的值由a[2][2]写入。从而可以推出来依赖关系。
i=3时的S2依赖于i=2时的S1,S1->S2,再来分析读写顺序,S1在前,S2在后,针对的是a变量,故为先写后读。
故为真依赖。即S1->TS2。
接下来分析i和j的元素,关于式中到底i+1还是i-1完全取决于i取的参考标准
假设i=2时,S1[i,j]->TS2[i+1,j+1]
假设i=3时,S1[i-1,j-1]->TS2[i,j]
循环独立依赖
循环独立依赖就很好分析,主要看不同语句之间的相同变量就可以了。
S1[i,j]->S3[i,j]//a
S1[i,j]->AS2[i,j]//b
S1[i,j]->AS3[i,j]//c
最后
以上就是高大黑米为你收集整理的共享存储并行编程(依赖关系) 前言 一、依赖分析 二、依赖关系 三.循环依赖分析的全部内容,希望文章能够帮你解决共享存储并行编程(依赖关系) 前言 一、依赖分析 二、依赖关系 三.循环依赖分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复