რა არის ფილიალის პროგნოზი?

თითქმის ნებისმიერ კომპიუტერულ პროგრამაში არის კოდის ნაწილები, რომლებიც განშტოებულია ცალკეულ ბილიკებზე. მაგალითად, თუ-მაშინ-სხვა განცხადებას აქვს ორი შესაძლო შედეგი. ეს განცხადებები არ წარმოადგენს რაიმე პრობლემას თანმიმდევრული პროცესორებისთვის, რადგან CPU ამუშავებს ყველა ბრძანებას თანმიმდევრობით. ფილიალები დიდ პრობლემას წარმოადგენს მილსადენის პროცესორებისთვის, რადგან რამდენიმე ინსტრუქცია ერთდროულად სრულდება.

სცენარი

პროგრამის შემთხვევაში განშტოების დებულებით ორი შესაძლო შედეგით, ორი შესაძლო კოდის ბილიკი არ შეიძლება იყოს ერთსა და იმავე ადგილას. ნებისმიერი ვარიანტის დასასრულებლად საჭირო დამუშავება განსხვავებული იქნება. წინააღმდეგ შემთხვევაში, პროგრამა არ განშტოდა. სავარაუდოდ, იქნება განშტოების განცხადებების საკმაოდ დიდი რაოდენობა, რომლებიც მხოლოდ ერთხელ იქნება მიღებული, მაგალითად, თუ განცხადება.

ასევე არსებობს განშტოების განცხადებები, რომლებიც ქმნიან მარყუჟს. მიუხედავად იმისა, რომ ეს შეიძლება არ იყოს ისეთივე რიცხობრივად გავრცელებული, როგორც ერთჯერადი გამოყენების განცხადებები, ისინი ზოგადად სტატისტიკურად მეორდება. შეიძლება ვივარაუდოთ, რომ უფრო სავარაუდოა, რომ ფილიალი დაგიბრუნებთ მარყუჟის გარშემო, ვიდრე არა.

რატომ არის ეს პრობლემა?

არ აქვს მნიშვნელობა, როგორ არის ეს პრობლემა ჩამოყალიბებული სრულად თანმიმდევრულ პროცესორში. ეს უბრალოდ არ არის პრობლემა. რომელი ფილიალი იქნება აღებული, ცნობილია შემდეგი ინსტრუქციის პირველი ნაწილის დამუშავებამდე.

თუმცა, მილსადენის მქონე პროცესორში, შემდეგი ინსტრუქციები რიგშია. ისინი უკვე მუშავდება, როცა პროცესორმა იცის რომელი ფილიალის აღება ხდება. მაშ, როგორ უნდა გაუმკლავდეს პროცესორი ამ სცენარს? რამდენიმე ვარიანტია. ყველაზე ცუდი უბრალოდ ლოდინი და მილსადენის უმოქმედობის დატოვებაა, სანამ ის ელოდება პასუხს, თუ რომელი განშტოება უნდა აიღოს. ეს ნიშნავს, რომ ყოველ ჯერზე, როდესაც თქვენ გაქვთ განშტოების განცხადება, თქვენ ყოველთვის დაკარგავთ პროცესორის დროის იმდენ ციკლს, რამდენი ეტაპი გაქვთ მილსადენის პროცესში.

ალტერნატიულად, შეგიძლიათ სცადოთ ორივე ვარიანტის გაშვება მილსადენში და გააუქმოთ არასწორი არჩევანი. ეს იქნება ნახევარი ჯარიმა, რომ არაფერი არ გაკეთებულა, მაგრამ მაინც დაგეკისრება შესრულების ჯარიმა ყველა განშტოებაზე. იმის გათვალისწინებით, რომ თანამედროვე პროცესორებს ასევე შეუძლიათ მწყობრიდან გამოსული ინსტრუქციების გაშვება, თქვენ შესაძლოა სცადოთ ყველა განშტოების ინსტრუქციის გაშვება რაც შეიძლება მალე. ასე რომ, მისი შედეგი ცნობილია მანამ, სანამ საჭირო იქნება. ეს ვარიანტი შეიძლება იყოს გამოსადეგი, გარდა იმისა, რომ არ არის მასშტაბირებადი. დავუშვათ, რომ თქვენ გაქვთ განშტოების განცხადებების შედარებით მაღალი სიმკვრივე. ამ შემთხვევაში, თქვენ უბრალოდ ვერ შეძლებთ ყველა მათგანის ადრე გაშვებას გარკვეული დროის უსაქმურობის გარეშე.

როგორ არის ეს საკითხი რეალურად განხილული

სინამდვილეში, პროცესორი მოიცავს ფილიალის პროგნოზირებას. ფილიალის პროგნოზირებადი ცდილობს გამოიცნოს განშტოების არჩევანის რომელი შედეგი იქნება მიღებული. შემდეგ პროცესორი ვარაუდობს, რომ პროგნოზი სწორია და გეგმავს ინსტრუქციებს. თუ ფილიალის პროგნოზირება ზუსტია, შესრულების ჯარიმა არ არსებობს.

თუ ფილიალის წინასწარმეტყველი შეცდომას უშვებს, თქვენ უნდა ჩამოიბანოთ მილსადენი და დაიწყოთ რეალური შედეგის დამუშავება. ეს იწვევს შესრულების ოდნავ უარეს ჯარიმას, ვიდრე არაფრის გაკეთების და მხოლოდ შედეგს ლოდინი. საუკეთესო შესრულების მისაღებად, მნიშვნელოვანია იმის უზრუნველყოფა, რომ ფილიალის პროგნოზირება მაქსიმალურად ზუსტი იყოს. ამასთან დაკავშირებით არსებობს სხვადასხვა მიდგომის სპექტრი.

შესაბამისი კოდი

მანქანურ კოდში, ფილიალი ყოველთვის არის არჩევანი შემდეგი ინსტრუქციის წაკითხვასა თუ სხვაგან ინსტრუქციების ნაკრების გადახტომას შორის. ფილიალების პროგნოზირების ზოგიერთი ადრეული განხორციელება უბრალოდ ვარაუდობდა, რომ ყველა ფილიალი ყოველთვის ან არასდროს იქნებოდა აღებული. ამ განხორციელებას შეიძლება ჰქონდეს საოცრად კარგი წარმატების მაჩვენებელი, თუ შემდგენლებმა იციან ეს ქცევა და იციან შექმნილია მანქანის კოდის დასარეგულირებლად ისე, რომ სავარაუდო შედეგი ემთხვევა პროცესორის გენერალს ვარაუდი. ეს მოითხოვს უამრავ რეგულირებას და პროგრამული უზრუნველყოფის განვითარების ჩვევების კორექტირებას.

კიდევ ერთი ალტერნატივა იყო სტატისტიკიდან იმის სწავლა, რომ მარყუჟები ჩვეულებრივ მიიღება და ყოველთვის ხტება, თუ ტოტი უკან მიდის ინსტრუქციების ნაკადი და არასოდეს გადახტეთ, თუ ნახტომი წინ არის, რადგან ეს ჩვეულებრივ სტატისტიკურად ნაკლებად სავარაუდოა, რომ დატოვოთ მარყუჟი. ეს არის სტატიკური განშტოების პროგნოზირების ორივე ტიპი, სადაც განშტოების შედეგი წინასწარმეტყველებულია კომპილაციის დროს.

დინამიური ფილიალის პროგნოზები

ფილიალების თანამედროვე პროგნოზები დინამიურია, იყენებს სტატისტიკას ამჟამად გაშვებული პროგრამიდან უკეთესი პროგნოზირების წარმატების მაჩვენებლების მისაღწევად. გაჯერების მრიცხველი არის საფუძველი ყველა მიმდინარე ფილიალის პროგნოზირებისთვის. პირველი გამოცნობა წყდება სტატიკურად ან შემთხვევით. მას შემდეგ, რაც ფილიალი იქნა აღებული ან არ აღებული, ეს შედეგი ინახება მეხსიერების ნაწილში. შემდეგ ჯერზე, როდესაც იგივე ტოტი შემოვა, განშტოების პროგნოზირებადია იგივე შედეგი, როგორც ადრე.

ეს ბუნებრივად იწვევს მარყუჟების პროგნოზირების კარგ მაჩვენებლებს. ამის ორი ვერსია არსებობს. ადრეული ვერსიები უბრალოდ იყენებდნენ ერთ ბიტ მონაცემს იმის დასადგენად, ფილიალი იყო აღებული თუ არა. მოგვიანებით ვერსიები იყენებენ ორ ბიტს სუსტად ან ძლიერად აღებულ ან მიუღებელ არჩევანს. ამ პარამეტრს მაინც შეუძლია იწინასწარმეტყველოს მარყუჟის აღების შედეგი, თუ პროგრამა მას დაუბრუნდება, ზოგადად ზრდის წარმატების მაჩვენებელს.

თვალთვალის ნიმუშები

შაბლონების თვალყურის დევნებისთვის, ზოგიერთი ფილიალის პროგნოზირება აკონტროლებს ისტორიას, თუ რა არჩევანი იქნა მიღებული. მაგალითად, დავუშვათ, რომ მარყუჟი განუწყვეტლივ იწოდება, მაგრამ მხოლოდ ოთხჯერ მოძრაობს მარყუჟიდან გასვლამდე. ამ შემთხვევაში, ორ დონის ადაპტირებულ პროგნოზს შეუძლია ამ ნიმუშის იდენტიფიცირება და მისი განმეორების პროგნოზირება. ეს კიდევ უფრო ზრდის წარმატების მაჩვენებელს უბრალო გაჯერებული მრიცხველით. თანამედროვე ფილიალების პროგნოზირები ეფუძნება ამას შემდგომი ნერვული ქსელის გამოყენებით შაბლონების დასადგენად და პროგნოზირებისთვის.

2-ბიტიანი გაჯერების ტოტის პროგნოზირს მაინც შეუძლია წინასწარ განსაზღვროს განშტოების აღება, მაშინაც კი, თუ ეს ადრე არ იყო. ეს საშუალებას აძლევს მას იწინასწარმეტყველოს, რომ მარყუჟი ხელახლა იქნება აღებული, თუნდაც ერთხელ დატოვოს.

ზოგიერთი ფილიალის პროგნოზირება იყენებს მრავალ ალგორითმს და შემდეგ ადარებს შედეგებს, რათა გადაწყვიტოს რომელი პროგნოზის გამოყენება. ზოგიერთი სისტემა ადევნებს თვალყურს თითოეული განშტოების ინსტრუქციას ცალ-ცალკე, რასაც ეწოდება ადგილობრივი განშტოების პროგნოზი. სხვები იყენებენ ფილიალების პროგნოზირების გლობალურ სისტემას, რათა თვალყური ადევნონ ყველა ბოლო განშტოების ინსტრუქციას. ორივეს აქვს თავისი გამოყენება და უარყოფითი მხარეები.

განშტოების პროგნოზირმა, რომელიც იყენებს ნიმუშის ისტორიის ცხრილს, შეუძლია განსაზღვროს განმეორებადი შაბლონები, როდესაც მიიღება გარკვეული ტოტები. მაგალითად, წინასწარმეტყველება, რომ მარყუჟი მხოლოდ სამჯერ იქნება მიღებული მისგან გასვლამდე.

დასკვნა

განშტოების პროგნოზიტორი არის მილსადენის მქონე CPU-ს სპეციალური ნაწილი. ის ცდილობს განშტოების ინსტრუქციის შედეგის პროგნოზირებას რეალური ინსტრუქციის დამუშავებამდე. ეს არის მილსადენის მქონე CPU-ს ძირითადი ფუნქცია, რადგან ის საშუალებას აძლევს პროცესორს შეინარჩუნოს მილსადენი გაჯერებული მაშინაც კი, თუ ის არ არის დარწმუნებული, რა ინსტრუქციები უნდა შესრულდეს. ისინი არ გვთავაზობენ შესრულების შემცირებას, როდესაც ისინი სწორია. თანამედროვე ალგორითმები შეიძლება იყოს ზუსტი შედარებით პროგნოზირებადი დატვირთვის დროს 97%-მდე.

არ არსებობს პროგნოზირების სრულყოფილი მეთოდი, ამიტომ განხორციელებები განსხვავდება. არასწორი პროგნოზის გაკეთების ეფექტი დამოკიდებულია მილსადენის სიგრძეზე. კერძოდ, მილსადენის სიგრძე, სანამ დადგინდება, არასწორი იყო თუ არა პროგნოზი. ეს ასევე დამოკიდებულია იმაზე, თუ რამდენი ინსტრუქციაა მილსადენის თითოეულ ეტაპზე. თანამედროვე მაღალი დონის დესკტოპის პროცესორებს აქვთ დაახლოებით 19 მილსადენის ეტაპი და შეუძლიათ მინიმუმ ოთხი ინსტრუქციის ერთდროულად გაშვება თითოეულ ეტაპზე.