Кіріспе
Компьютерлік ғылымда деректерге тәуелділік – бағдарламаның нұсқауы (инструкциясы) алдыңғы нұсқаудың деректеріне сілтеме жасайтын жағдай. Компилятор теориясында, нұсқаулар (немесе командалар) арасындағы деректердің тәуелділігін анықтауға қолданылатын әдіс тәуелділік талдауы деп аталады.
Шын тәуелділік (оқылғаннан кейін жазылған)
Шынайы тәуелділік, сондай-ақ ағын тәуелділігі немесе дерек тәуелділігі деп аталады, егер бір нұсқаудың орындалуы алдыңғы нұсқаудың нәтижесіне байланысты болса. Шынайы тәуелділіктің бұзылуы жазудан кейін оқу (RAW) қаупіне алып келеді. 1. A = 3 2. B = A 3. C = B. 3-нұсқау 2-нұсқауға шынайы тәуелді, себебі C-ның соңғы мәні B-ны жаңартатын нұсқаудың нәтижесіне байланысты. 2-нұсқау 1-нұсқауға шынайы тәуелді, себебі B-ның соңғы мәні A-ны жаңартатын нұсқаудың нәтижесіне байланысты. 3-нұсқау 2-нұсқауға және 2-нұсқау 1-нұсқауға шынайы тәуелді болғандықтан, 3-нұсқау да 1-нұсқауға шынайы тәуелді болады. Сондықтан, осы мысалда нұсқаулық деңгейдегі параллелизм мүмкін емес.
2. B = A
3. C = B
Instruction 3 is truly dependent on instruction 2, as the final value of C depends on the instruction updating B. Instruction 2 is truly dependent on instruction 1, as the final value of B depends on the instruction updating A. Since instruction 3 is truly dependent upon instruction 2 and instruction 2 is truly dependent on instruction 1, instruction 3 is also truly dependent on instruction 1. Instruction level parallelism is therefore not an option in this example.
Шығысқа тәуелділік (жазудан кейін жазу)
Шығыс тәуелділігі нұсқаулардың реті айнымалының соңғы шығыс мәніне әсер еткенде туындайды. Шығыс тәуелділігінің бұзылуы жазудан кейін жазу (WAW) қаупіне алып келеді. Төмендегі мысалда 3-ші және 1-ші нұсқаулар арасында шығыс тәуелділігі бар – осы мысалдағы нұсқаулардың ретін өзгерту A-ның соңғы мәнін өзгертеді, сондықтан бұл нұсқаулар параллель орындала алмайды. 1. B = 3 2. A = B + 1 3. B = 7. Анти-тәуелділіктер сияқты, шығыс тәуелділіктері де атау тәуелділіктері болып табылады. Яғни, оларды айнымалылардың атауларын өзгерту арқылы жоюға болады, мысалы, жоғарыдағы мысалдың төмендегі өзгертілген түрінде: 1. B2 = 3 2. A = B2 + 1 3. B = 7.
2. A = B + 1
3. B = 7
As with anti dependencies, output dependencies are name dependencies. That is, they may be removed through renaming of variables, as in the below modification of the above example:
1. B2 = 3
2. A = B2 + 1
3. B = 7
Салдары
Әдеттегі бағдарламалар ретті орындалу моделі негізінде жазылады. Осы модель бойынша нұсқаулар бірінен соң бірі, атомдық түрде (яғни, кез келген сәтте тек бір нұсқау орындалады) және бағдарламада көрсетілген тәртіппен орындалады. Дегенмен, операторлар немесе нұсқаулар арасындағы тәуелділіктер параллелизмге – бірнеше нұсқаудың параллель орындалуына, параллелдеуші компилятор немесе нұсқаулық деңгейдегі параллелизмді пайдаланатын процессор арқылы – кедергі келтіруі мүмкін. Қатысты тәуелділіктерді ескермей, бірнеше нұсқауды салғысыз орындау дұрыс емес нәтижелерге, атап айтқанда, қауіптерге алып келуі мүмкін.
Есептеу жүйесіндегі маңызы
Деректерге тәуелділіктер есептеудің түрлі салаларында маңызды, әсіресе процессор дизайнында, компилятор құрастыруда, параллель есептеуде және бірдей уақытта орындалатын бағдарламалауда.
Процессордың құрылысы
Нұсқаулық құбырлары: Құбырлы процессорларда бірнеше нұсқаулар бірнеше құбыр сатысында параллель орындалады. Осыған байланысты, тіркелімдер арасындағы дерекке тәуелділіктер ескеріліп, процессор құбырында өңделуі керек. Ең маңыздысы – нақты тәуелділіктер, олар, мысалы, құбырды тоқтату немесе операндарды жіберу арқылы шешіледі. Ретсіз орындалу: Қазіргі заманғы процессорлар өнімділікті арттыру үшін нұсқауларды бастапқы ретінен тыс орындайды. Осыған байланысты, тіркелімдер арасындағы атау тәуелділіктері де ескерілуі керек (дерек тәуелділіктерімен қатар) және мысалы, тіркелімдерді қайта атау немесе көрсеткіштер тақтасы арқылы шешіледі. Дерек тәуелділіктері жадқа қол жеткізу кезінде де маңызды және жадты ажырату техникалары арқылы ескерілуі керек, бұл жадқа қол жеткізу нұсқауларын (жүктеулер мен сақтаулар) бағдарламалық ретінен тыс орындайды.
Компилятор құрылымы
Деректердің тәуелділігі компилятордың әртүрлі оңтайландырулары үшін маңызды, мысалы:
Нұсқауды жоспарлау: Компиляторлар деректердің тәуелділігін ескере отырып нұсқауларды жоспарлауға тиіс. Бұл кодты жақсырақ орындау үшін қайта құруды жүзеге асыратын оңтайландырылған компиляторлар үшін аса маңызды. Цикл түрлендірулері: Циклдарды оңтайландыру кезінде компиляторлар бағдарламаның мағынасын өзгертпей, циклді жаю (loop unrolling), біріктіру (fusion) немесе бөлу (tiling) сияқты түрлендірулерді қолдану үшін деректердің тәуелділігін ескеруі керек. Кодты жылжыту: Компилятор кодтың бір бөлігін жылжытуды қарастырғанда, деректердің тәуелділігі бұзылмауына көз жеткізуі керек.