我是靠谱客的博主 高大黑米,最近开发中收集的这篇文章主要介绍共享存储并行编程(依赖关系) 前言 一、依赖分析 二、依赖关系 三.循环依赖分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

 ​​​​

  • 目录
    • 前言

      一、依赖分析

      二、依赖关系

      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

最后

以上就是高大黑米为你收集整理的共享存储并行编程(依赖关系) 前言 一、依赖分析 二、依赖关系 三.循环依赖分析的全部内容,希望文章能够帮你解决共享存储并行编程(依赖关系) 前言 一、依赖分析 二、依赖关系 三.循环依赖分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部