Muhammad Al-Xorazmiy nomidagi Toshkent axborot texnologiyalari universiteti Fan: Kompyuter arxitekturasi


Download 0.88 Mb.
bet5/5
Sana28.12.2022
Hajmi0.88 Mb.
#1015380
1   2   3   4   5
Bog'liq
4-topshiriq(urolov Shohruh)

Bu erda aniq taxmin shuki, gcc-6 eng so'nggi versiya, shuning uchun men kompilyatsiya qilish uchun foydalanaman:

gcc-6 -fopenmp hellosmp.c Ishlaydi!
Yana bir misol ( bu yerda ): massivdagi barcha elementlarni qo'shish.
//example4.c: massivdagi barcha elementlarni parallel ravishda qo'shish #include < stdio.h >
int main() {
const int N=100;
int a[N];
//
(int i=0; i < N; i++)
a[i] = i uchun ishga tushirish;
//hisoblash summasi
int local_sum, sum;
#pragma omp parallel xususiy(mahalliy_sum) umumiy(sum)
{
local_sum =0;
//massiv mavzular orasida statik ravishda taqsimlanadi #pragma omp uchun schedule(static,1)
for (int i=0; i< N; i++) {
local_sum += a[i];
}
//har bir mavzu o'zining local_sumini hisoblab chiqdi. Barcha mavzular
// global summaga qo'shilishi kerak. Ushbu operatsiya atomik bo'lishi juda muhimdir.
#pragma omp kritik
summa += local_sum;
}
printf("sum=%d %d\n bo'lishi kerak", yig'indi, N*(N-1)/2);
}
Parallel va forni birlashtirgan “parallel for” direktivasi ham mavjud (parallel ichida a forni joylashtirish shart emas):
int main(int argc, char **argv)
{
int a[100000];
#pragma omp parallel for
(int i = 0; i < 100000; i++) { 7
a[i] = 2 * i;
printf(“tayinlash i=%d\n†);
}
return 0;
}


Bu savolga bitta javob yo'q. Agar dasturiy ta'minotingiz taqsimlangan tizimda, masalan, klasterda ishlashi kerak bo'lsa, MPI bu uchta variantdan yagona variantingizdir. Agar siz dasturiy ta'minotingizni faqat bitta kompyuterda ishga tushirishni istasangiz, MPI qo'shimcha xarajatlarga arzimaydi. Eng muhimi, har bir MPI jarayoni bir xil hajmdagi xotirani ajratishini hisobga olish kerak, OpenMP bilan esa umumiy xotira modelidan foydalanadi.
Shaxsan men OpenMP ni boshlash uchun eng oson deb o'ylayman. Boshida ba'zi for-looplaringizni parallellashtirish uchun sizga juda oz sonli direktivalar kerak bo'ladi. To'liq OpenMP standartini tushunish qiyin va undan eng yaxshi ishlashni olish ham qiyin.
CUDA - bu butunlay boshqacha model, lekin uni o'rganish juda qiyin deb o'ylamayman. Chunki u protsessor dasturlashdan farq qiladi, yaxshi kirish
materiali mavjud. CUDA yadrosini o'rnatish uchun ko'pchilik nusxa ko'chirish va o'tmishdir, bu esa bu qadamni juda oson qiladi. Yadro dasturlash biroz qiyinroq. Ammo, bu erda ham birinchi yadroni ishga tushirish oson. Boshqa ikkitasida bo'lgani kabi, eng yaxshi parallel ishlash uchun yadroni nihoyat sozlash qiyin.


Endi aytmoqchimanki, bulardan qaysi biri sizga ko'proq foyda keltirishi ishingizga bog'liq. Klaster dasturiy ta'minoti uchun siz MPIni aylanib o'ta olmaysiz. Kichikroq ilmiy dasturlar uchun sizga OpenMP kerak bo'ladi. Agar siz CUDA talab qilinadigan ish topmoqchi bo'lsangiz, siz haqiqatan ham mutaxassis bo'lishingiz kerak. O'ylaymanki, u erda juda ko'p yaxshi CUDA dasturchilari bor va CUDA muhim talab sifatida ko'p ish o'rinlari yo'q.


Shunday qilib, siz boshqalardan yaxshiroq bo'lishingiz kerak. To'g'ridan- to'g'ri tadqiqotda bo'lmagan ko'pgina ishlarda parallellashtirishning boshqa usullari muhimroqdir. Oddiy ish stoli dasturiy ta'minoti odatda mavzularni yoki asinxron hisoblarni boshlash uchun kutubxonalardan foydalanadi. C++ 11 bilan bu allaqachon STL ichiga o'rnatilgan. Bu ko'pgina dasturiy ta'minot uchun muhim mahoratga aylanadi (lekin bu siz dasturlamoqchi bo'lgan dasturiy ta'minot turiga bog'liq). Ushbu sohalarda CUDA emas, balki OpenCL ham muhim bo'lishi mumkin, chunki u portativdir. OpenCL CUDA dan muhimroq bo'lgan ko'plab sohalar bo'ladi. Ayniqsa, Mac platformasi OpenCL uchun kod yozmoqchi bo'lsangiz, qiziqish uyg'otadi.
Menimcha, siz qila oladigan eng yaxshi narsa MPI va boshqasini o'rganishdir. Gibrid parallellashtirish tobora muhim ahamiyat kasb etmoqda. Bizning simulyatsiya dasturimiz MPI va OpenMP da alohida parallellashtirilgan, ya'ni siz ulardan faqat bittasini tanlashingiz mumkin. Klasterlarimizdagi xotira cheklovlari tufayli biz bir vaqtning o'zida MPI va OpenMP dan foydalangan holda gibrid simulyatsiya uchun bordik - umumiy xotiradan foydalangan holda kompyuterlar va bitta kompyuterdagi mavzular uchun OpenMP o'rtasida muloqot qilish uchun MPI dan foydalaning.
Boshqa loyihada men OpenCL dan foydalanmoqdaman, chunki protsessor real vaqtda vizualizatsiya uchun etarlicha kuchli bo'lmasligini kutamiz.
Dasturiy ta'minot iste'molchi darajasidagi uskunada ishlashi kerak. CUDA variant emas, chunki u portativ emas. Bundan tashqari, OpenCL ning afzalligi shundaki, hech bo'lmaganda nazariy jihatdan biz protsessorda ham, GPUda ham ishlay olish uchun manba kodini faqat bir marta yozishimiz kerak (agar tegishli GPU mavjud bo'lmasa, protsessorni tanlang).

Yuqoridagi rasmda openMP va CUDA texnologiyalari vazifa bajarish tezligi bo'yicha grafigi tasvirlangan


Xulosa

Kritik bo'limlar va atom bo'limlari bajarilishini ketma-ketlashtiradi va iplarning bir vaqtning o'zida bajarilishini yo'q qiladi. Agar noto'g'ri ishlatilsa, OpenMP kodi ketma-ket koddan ham yomonroq bo'lishi mumkin, chunki barcha ish zarralari. Fikrimcha OpenMP sehr emas. OpenMP uni ochishi va iplar orasidagi iteratsiyalarni belgilashni osonlashtirishi uchun tsikl aniq parallel bo'lishi kerak. Agar bir iteratsiyadan ikkinchisiga ma'lumotlarga bog'liqlik mavjud bo'lsa, OpenMP uni parallellashtira olmaydi.





Tim Mattson, YouTube'da ma'ruzalar Openmp.org saytida qo'shimcha o'qish:
Download 0.88 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling