Adatfüggőség
Az adatfüggőség a számítástechnikában olyan helyzet, amelyben egy utasítás egy korábbi utasításban lévő adatra utal. A fordítóelméletben az utasítások adattól való függőségének felfedezésére alkalmazott technikát függőségelemzésnek hívják.
Háromféle függőség van: adat-, név- és vezérlésfüggőség.
Adatfüggőségek
[szerkesztés]Feltételezve és utasítást, függ -től ha
ahol
- az által olvasott memóriahelyek halmaza;
- az által írt memóriahelyek halmaza;
- és van egy megvalósítható végrehajtási útvonal és között.
Ez a Bernstein-állapot, amelyet A. J. Bernstein nevezett el.
Három eset létezik:
- Valódi függőség: , és ír valamit, mielőtt azt olvasná.
- Hamis függőség: , és olvas valamit, mielőtt azt felülírná.
- Kimeneti függőség: , és mindkettő ugyanarra a memóriahelyre ír.
Valódi függőség
[szerkesztés]Valódi függőség (read after write, RAW) akkor fordul elő, ha egy utasítás egy előző utasítás eredményétől függ:
1. A = 3 2. B = A 3. C = B
A 3. és a 2. utasítás között valódi függőség van, mivel a C végső értéke a B frissítésétől függ. A 2. és az 1. utasítás között is valódi függőség van, mivel a B végső értéke az A frissítésétől függ. Mivel a 3. és a 2., illetve a 2. és az 1. utasítás között valódi függőség van, ezért a 3. és az 1. utasítás között is valódi függőség lesz. Az utasításszintű párhuzamosság ezért ebben a példában nem lehetséges.[1]
Hamis függőség
[szerkesztés]Hamis függőség (write after read, WAR) akkor fordul elő, amikor egy utasítás egy később frissített változót igényel. A következő példában a 3. és a 2. utasítás között hamis függőség van – ezeknek az utasításoknak a sorrendje nem változtatható meg, és nem hajthatók végre párhuzamosan, mivel ez befolyásolja az A végső értékét.
1. B = 3 2. A = B + 1 3. B = 7
A hamis függőség egy példa a névfüggőségre. Vagyis a változók átnevezése megszüntetheti a függőséget, mint a következő példában:
1. B = 3 N. B2 = B 2. A = B2 + 1 3. B = 7
Egy új B2 változót vezetünk be a B jelölésére egy új, N. utasításban. A 3. és a 2. utasítás között a függőség megszűnt, ami azt jelenti, hogy ezeket az utasításokat most párhuzamosan is végre lehet hajtani. A módosítás azonban új függőséget vezetett be: a 2. és az N., valamint az N. és az 1. utasítás között valódi függőség van. Mivel valódi függőségek, ezért ezeket lehetetlen biztonságosan eltávolítani.[1]
Kimeneti függőség
[szerkesztés]Kimeneti függőség (write after write, WAW) akkor fordul elő, amikor az utasítások rendezése befolyásolja egy változó végső kimeneti értékét. Az alábbi példában egy kimeneti függőség van a 3. és az 1. utasítás között – ebben a példában az utasítások sorrendjének módosítása megváltoztatja az A végső értékét, így ezeket az utasításokat nem lehet párhuzamosan végrehajtani.
1. B = 3 2. A = B + 1 3. B = 7
Mint a hamis függőségnél, a kimeneti függőségek névfüggőségek is. Vagyis ezek eltávolíthatók a változók átnevezésével, a fenti példa alábbi módosítása szerint:
1. B2 = 3 2. A = B2 + 1 3. B = 7
Az adattfüggőségek általánosan használt elnevezései a következők: read after write vagy RAW (valódi függőség), write after read vagy WAR (hamis függőség), write after write vagy WAW (kimeneti függőség).[1]
Vezérlésfüggőség
[szerkesztés]Az A és a B utasítás között vezérlésfüggőség van, ha az A kimenetele határozza meg, hogy a B-t végre kell-e hajtani, vagy sem. A következő példában az és az utasítás között vezérlésfüggőség van. Azonban az nem függ az -től, mivel az -at mindig végrehajtják, függetlenül az -től.
S1. if (a == b) S2. a = a + b S3. b = a + b
Intuitív módon a B és az A utasítás között vezérlésfüggőség van, ha
- a B végrehajtása az A után lehetséges, és
- az A végrehajtásának kimenetele határozza meg, hogy a B végrehajtásra kerül-e, vagy sem.
Jellemző példa, hogy vezérlésfüggőségek vannak az if állítás feltételes része és az igaz/hamis állításai között.
A vezérlésfüggőség formális meghatározása az alábbiak szerint adható meg:
Az és az utasítás között akkor és csak akkor van vezérlésfüggőség, ha
- létezik egy út és között, amelyen minden utasításra teljesül, hogy , és amelyet a program végéig minden lehetséges úton követ , továbbá
- -nek nem feltétlenül kell követnie -et, például ha létezik egy végrehajtási út -től a program végéig, amely nem megy keresztül -n.
Jegyzetek
[szerkesztés]- ↑ a b c John L. Hennessy; David A. Patterson. Computer Architecture: a quantitative approach (3rd ed.). Morgan Kaufmann (2003). ISBN 1-55860-724-2
Fordítás
[szerkesztés]- Ez a szócikk részben vagy egészben a Data dependency című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.