იგივე ფასის GPU-ს თუ შევადარებთ CPU-ს FLOPS-ებით(მცოცავმძიმიან რიცხვებზე ოპერაციები წამში) ვნახავთ, რომ GPU შესაძძლოა 10-ჯერ ჯობნიდეს CPU-ს(რასაც საკმაოდ ხშირად აკეთებენ მომხმარებლისთვის თვალის ასახვევად), თუმცა განსხვავებული არქიტექტურის გამო CPU და GPU-ს შედარება FLOPS-ებით არაა გამართლებული. მათი უკეთ შედარება რომ შევძლოთ განვიხილოთ ამ პროცესორების არქიტექტურა.
CPU-ებს აქვთ მძლავრი ბირთვები(2.0-3.0GHz და მეტი) და ასევე აქვთ ბირთვებზე SIMD რეგისტრები, რომლებიც ერთ პროცესორულ ციკლზე მრავალ მონაცემზე ერთი ინსტრუქციის შესრულების საშუალებას იძლევა. SIMD რეგისტრების სიგანე შეზღუდულია, მაგალითად თანამედროვე პროცესორებში შესაძლებელია ოპერაციები შესრულდეს 4, 8, 16 float-ზე ერთდროულად. ასევე CPU-ები გამოირჩევიან რამოდენიმე დონიანი კეშებით, რომლებიც ოპერატიული მეხსიერებიდან პროცესორის რეგისტრებში ინსტრუქციებისა და მონაცემების გადაცემას აჩქარებს. თანამედროვე პროცესორებს ასევე აქვთ ბევრი შიდა ოპტიმიზაცია(როგორიცაა მაგალითად განშტოებების ამოცნობა,) რაც ხშირ შემთხვევაში პროცესორის მუშაობას საგრძნობლად აჩქარებს.
GPU-ებს განსხვავებით CPU-ებისაგან აქვთ დიდი რაოდენობით ნაკლებად მძლავრი ბირთვები(~1GHz), რომლებსაც თავისმხრივ შეუძლიათ უფრო განიერი SIMD ოპერაციების შესრულება. რაც საერთო ჯამში გვაძლევს ძალიან ბევრ პარალელურ გამომთვლელს, თუმცა უნდა გვახსოვდეს, რომ SIMD გამოთვლების ეფექტურობა მკვეთრადაა დამოკიდებული ერთ SIMD-ზე არსებული გამოთველის მსგავსებაზე. მათ აქვთ ბევრად უფრო მაღალი სიჩქარის კავშირი შიდა გრაფიკულ მეხსიერებასთან(~200GB/s) და არ აქვთ მრავალდონიანი კეშები. ოპერატიული მეხსიერებიდან მონაცემების მიწოდება GPU-ს შიდა გრაფიკულ მეხსიერებაში ხდება მთავარი შინის და PCI პორტის გავლით, რაც საკმაო დროს მოითხოვს. ასევე მათ CPU-ებისაგან განსხვავებით არ აქვთ შიდა სტატისტიკურ ანალიზზე დაფუძნებული შიდა ოპტიმიზაციები. ყველაფერ ამის გამო GPU-სთვის განშტოებებისაგან თავისუფალი გამოთვლები ბევრად უფრო იოლია და ეფექტური. ასევე უნდა აღინიშნოს, რომ GPU მეხსიერება ბევრად უფრო შეზღუდულია და აპლიკაციები, რომლებიც დიდ მეხსიერებას ითხოვენ და გრაფიკულ კარტაზე მეხსიერება არაა საკმარისი ახდენენ მეხსიერების ნაწილ ნაწილ გადაცემა/დამუშავებას, რაც პროცესს კიდევ უფრო ართულებს.
CPU-ებს აქვთ მძლავრი ბირთვები(2.0-3.0GHz და მეტი) და ასევე აქვთ ბირთვებზე SIMD რეგისტრები, რომლებიც ერთ პროცესორულ ციკლზე მრავალ მონაცემზე ერთი ინსტრუქციის შესრულების საშუალებას იძლევა. SIMD რეგისტრების სიგანე შეზღუდულია, მაგალითად თანამედროვე პროცესორებში შესაძლებელია ოპერაციები შესრულდეს 4, 8, 16 float-ზე ერთდროულად. ასევე CPU-ები გამოირჩევიან რამოდენიმე დონიანი კეშებით, რომლებიც ოპერატიული მეხსიერებიდან პროცესორის რეგისტრებში ინსტრუქციებისა და მონაცემების გადაცემას აჩქარებს. თანამედროვე პროცესორებს ასევე აქვთ ბევრი შიდა ოპტიმიზაცია(როგორიცაა მაგალითად განშტოებების ამოცნობა,) რაც ხშირ შემთხვევაში პროცესორის მუშაობას საგრძნობლად აჩქარებს.
GPU-ებს განსხვავებით CPU-ებისაგან აქვთ დიდი რაოდენობით ნაკლებად მძლავრი ბირთვები(~1GHz), რომლებსაც თავისმხრივ შეუძლიათ უფრო განიერი SIMD ოპერაციების შესრულება. რაც საერთო ჯამში გვაძლევს ძალიან ბევრ პარალელურ გამომთვლელს, თუმცა უნდა გვახსოვდეს, რომ SIMD გამოთვლების ეფექტურობა მკვეთრადაა დამოკიდებული ერთ SIMD-ზე არსებული გამოთველის მსგავსებაზე. მათ აქვთ ბევრად უფრო მაღალი სიჩქარის კავშირი შიდა გრაფიკულ მეხსიერებასთან(~200GB/s) და არ აქვთ მრავალდონიანი კეშები. ოპერატიული მეხსიერებიდან მონაცემების მიწოდება GPU-ს შიდა გრაფიკულ მეხსიერებაში ხდება მთავარი შინის და PCI პორტის გავლით, რაც საკმაო დროს მოითხოვს. ასევე მათ CPU-ებისაგან განსხვავებით არ აქვთ შიდა სტატისტიკურ ანალიზზე დაფუძნებული შიდა ოპტიმიზაციები. ყველაფერ ამის გამო GPU-სთვის განშტოებებისაგან თავისუფალი გამოთვლები ბევრად უფრო იოლია და ეფექტური. ასევე უნდა აღინიშნოს, რომ GPU მეხსიერება ბევრად უფრო შეზღუდულია და აპლიკაციები, რომლებიც დიდ მეხსიერებას ითხოვენ და გრაფიკულ კარტაზე მეხსიერება არაა საკმარისი ახდენენ მეხსიერების ნაწილ ნაწილ გადაცემა/დამუშავებას, რაც პროცესს კიდევ უფრო ართულებს.
რაც შეეხება პროგრამირების ხელსაწყოებს იმისათვის რომ შევძლოთ CPU ბირთვების გამოყენება საჭიროა პროგრამა ქმნიდეს ნაკადებს სხვა შემთხვევაში თუკი პროგრამა მუშაობს ერთ ნაკადში ის მხოლოდ პროცესორის ერთ ბირთვს იყენებს. ნაკადის შესაქმნელად არსებობს სპეციალური ფუნქციები სხვადასხვა ენებში ასევე ბიბლიოთეკები OpenMP. GPU პროგრამირების ხელსაწყოებს რაც შეეხება არსებობს SPMD(ერთი პროგრამა მრავალი მონაცემი) ენები მაგალითად CUDA, OpenCL რომლებიც აბსტრაგირებას უკეთებენ არქიტექტურას რაც პროგრამირებას საგრძნობლად აადვილებს. OpenCL იძლევა საშუალებას რომ ვიმუშაოთ როგორც სხვადასხვა ტიპის GPU-ებთან ასევე CPU-თან თუმცა მაგალითად NVIDIA-ს კარტებისთვის CUDA ბევრად ეფექტურია ამიტომაც მას უფრო ხშირად იყენებენ მაქსიმალური წარმადობის მისაღწევად. რაც შეეხება CPU-ზე SIMD გამთვლებს ამისათვის არსებობს სპეციალური ფუნქციები თუმცა რამოდენიმე წელია რაც Intel-მა შექმნა ISPC რამაც ძალიან გაადვილა პროცესორთან მუშაობა. ISPC გვეხმარება SIMD პროგრამირებაში ერთი ნაკადის ფარგლებში ასე რომ თუ გვსურს CPU-ს სრული რესურსის გამოყენება უნდა შევქმნათ ნაკადები(სასურველია შეიქმნას იმდენი ნაკადი რამდენი ბირთვიც აქვს პროცესორს) მაგალითად OpenMP-ს საშუალებით და თითოეულ ნაკადში SIMD გამოთვლები მაგალითად ISPC-ს გამოყენებით.
Comments
Post a Comment