ISPC ძალიან ამარტივებს პარალელური გამოთვლების კეთების პროცესს და შესაბამისად ზრდის პროდუქტიულობას. ის არა მხოლოდ ინტერპრეტატორია კოდის არამედ შეიცავს რიგ კოდის ოპტიმიზატორებს რათა მაქსიმალურად გაზარდოს პროგრამის ეფექტურობა. თუმცა დოკუმენტაციის თანახმად დიდი ყურადღება უნდა მიექცეს მონაცემებზე წვდომას, რათა მივიღოთ ადვილად და მეტად ეფექტურად გაპარალელებადი პროგრამული კოდი. მონაცემების შეგროვება/გაბნევა(gather/scatter) პროგრამაში ართულებს მის გაპარალელებას რაც ამცირებს ეფექტურობას. მონაცემებზე წვდომა მკვეთრად მოქმედებს წარმადობაზე, რადგან პირდაპირ არის დამოკიდებული პროცესორის კეშის მოქმედების ეფექტურობაზე. ამისთვის Intel-ის დეველოპერები გვირჩევენ რომ სადაც არის საშუალება თავი ავარიდოთ AoS-ის ტიპის ჩანაწერებს და სანაცვლოდ გამოვიყენოთ SoA და ISPC თავადვე გვაძლევს მონაცემების ტრანსფორმაციის საშუალებას. ამ ყველაფრის გაუთვალისწინებლობის შემთხვევაში კომპილატორი გაფრთხილებთ წარმადობის დაკარგვის შესახებ.
ISPC არ ახდენს კოდის გაპარალელებას პროცესორის ბირთვებზე, ის მხოლოდ ბირთვზე არსებული SIMD გამომთვლელებთან მუშაობს, ამიტომ ბირთვებზე გაპარალელება მთლიანად დეველოპერის ხელშია. მოვიყვანოთ მარტივი მაგალითი:
export void rgb_2_gray( uniform float rgb_buffer_soa_in[],
uniform int w,
uniform int h,
uniform float gray_buffer_soa_out[] ) {
uniform int pixelCount = w*h;
uniform float* rgb[3] = { rgb_buffer_soa_in, rgb_buffer_soa_in + pixelCount, rgb_buffer_soa_in + pixelCount*2 };
uniform float weight[3] = { 0.2126, 0.7152, 0.0722 };
foreach (index = 0 ... pixelCount) {
gray_buffer_soa_out[index] = rgb[0][index]*weight[0] + rgb[1][index]*weight[1] + rgb[2][index]*weight[2];
}
}
მოცემული კოდი ახდენს rgb გამოსახულების გარგაქმნას შავთეთრ გამოსახულებაში. შემავალი და გამომავალი მონაცემები მეტი ეფექტურობისთვის მოწესრიგებულია SoA სახით. 128 ბიტიანი SSE რეგისტრების შემთხვევაში 4 float-ზე ერთდროულად მოხდება გამოთვლა რაც დაახლოებით 4x-მდე ააჩქარებს კოდს. ISPC პროექტი მთლიანად ღია კოდითაა, შეგიძლიათ მოქაჩოთ საიტიდან და თავად მოსინჯოთ მისი შესაძლებლობები.
Comments
Post a Comment