1 OpenMP OpenMP
OpenMP-umumiy xotiraga ega tizimlar uchun parallel dasturlarni yozish mexanizmi. Kompilyator direktivalari va kutubxona funktsiyalari to'plamidan iborat. C/C++, Fortran-da juda ko'p ishlaydigan ilovalarni osongina yaratishga imkon beradi. Qurilma ishlab chiqaruvchilari (Intel, HP, SGI, Sun, IBM), ishlab chiquvchilar tomonidan qo'llab-quvvatlanadi kompilyatorlar (Intel, Microsoft, KAI, PSI, PSR, APR, Absoft) OpenMP dasturiy modeli Asosiy oqim zarur bo'lganda bolalar oqimlarini hosil qiladi. Fork-join modeli. Kompilyator direktivasi
Последовательный код
void main(){
double x[1000];
for(i=0; i<1000; i++){
calc_smth(&x[i]);
}
}
Параллельный код
void main(){
double x[1000];
#pragma omp parallel for ...
for(i=0; i<1000; i++){
calc_smth(&x[i]);
}
}
Direktiv #pragma omp parallel for ushbu tsiklni ajratish kerakligini ko'rsatadi oqimlar orasidagi yinelemelerle. Oqimlarning soni dasturdan yoki ish vaqti muhitidan kuzatilishi mumkin dasturlar-atrof-muhit o'zgaruvchisi OMP_NUM_THREADS. Shuni ta'kidlash kerakki, ishlab chiquvchi oqimlarni sinxronlash va qaramlik uchun javobgardir ma'lumotlar orasida. Openmp-ni qo'llab-quvvatlaydigan dasturni kompilyatsiya qilish uchun derleyici kerak qo'shimcha kalitni ko'rsating:
icc -openmp prog.c
ifc -openmp prog.f
Oqimlar qanday ta'sir qiladi? Birgalikda xotiraga ega bo'lgan modelda oqimlarning o'zaro ta'siri birgalikda amalga oshiriladi o'zgaruvchilar. Dasturda bunday o'zgaruvchilar bilan noto'g'ri ishlash mumkin raqobat xatolar (poyga holati) paydo bo'ladi. Buning sababi shundaki, oqimlar parallel ravishda amalga oshiriladi va shunga ko'ra, birgalikda foydalanish tartibi o'zgaruvchilar dasturning bir ishga tushirilishidan boshqasiga farq qilishi mumkin. Raqobat xatolarini nazorat qilish uchun oqimlarning ishlashi sinxronlashtirilishi kerak. Uchun bu muhim bo'limlar, to'siqlar kabi sinxronizatsiya primitivlaridan foydalaniladi, atom operatsiyalari va qulflar 1 . Shuni ta'kidlash kerakki, sinxronizatsiya talab qilinishi mumkin dasturdan qo'shimcha xarajatlar kelib chiqadi va o'ylash va tarqatish yaxshiroqdir
ma'lumotlar sinxronizatsiya nuqtalarining sonini minimallashtirishga imkon beradi.
OpenMP Asoslari Sinopsis
Asosan, OpenMP dizaynlari kompilyator direktivalaridir C / C++ direktivalari uchun quyidagi ko'rinish mavjud:
#pragma omp qurilish [ahvoli]...]
Fortran uchun ko'rsatmalar quyidagi shakllardan birini qabul qiladi:
c $ omp qurilish [ahvoli]...]
!$omp qurilish [ahvoli]...]
* $ omp qurilish [ahvoli]..
OpenMP dizaynlari ko'rsatmalar bo'lgani uchun, ularni emas, balki kompilyator tushunadi, ularni sog'inadi va hali openmp dasturini to'playdi, haqiqat izchil. Aksariyat hollarda OpenMP direktivalari faqat strukturaviy bloklarga nisbatan qo'llaniladi, qaysi yagona kirish nuqtasi va yagona chiqish nuqtasi bor. Faqat istisno-Fortran tilida STOP operatori va C/C++da Exit() funksiyasi.
#pragma omp parallel
{
L1:
wrk[id] = junk[id];
res[id] = wrk[id]*1.342;
if(conv(res)) goto L1;
}
printf("%d", id);
Правильно
#pragma omp parallel
{
L1:
wrk[id] = junk[id];
L2:
res[id] = wrk[id]*1.342;
if(conv(res)) goto L3;
goto L1;
}
if(not_done) goto L2;
L3:
printf("%d", id);
Do'stlaringiz bilan baham: |