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


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

Pa


Asosiy direktiva:
#pragma omp parallel
{
}
Asosiy ip bu qatorga yetganda, #pragma konstruktsiyasidan keyin blokga o'ralgan ishni bajarish uchun qo'shimcha iplarni vilkalaydi. Blok barcha iplar tomonidan parallel ravishda bajariladi. Asl ip ip-id 0 bilan asosiy ip sifatida belgilanadi.
Misol (C dasturi): "Salom, dunyo"ni ko'rsatish. bir nechta iplardan foydalanish.
#include < stdio.h > int main (void)
{
#pragma omp parallel
{
printf("Salom, dunyo.\n");
}
return 0;
}
Gcc yordamida kompilyatsiya qilish uchun bayroq -fopenmp dan foydalaning:
$ gcc -fopenmp salom.c -o salom
Ikki yadroli va shuning uchun ikkita ipli kompyuterda chiqish: Salom Dunyo.
Salom Dunyo.
Doverda men 24 ta ip uchun 24 ta salom oldim. Ish stolimda men olaman (faqat) 8. Siz qancha olasiz?
E'tibor bering, barcha iplar standart chiqishga yoziladi va uni almashish uchun poyga bor. Iplarni bir-biriga qo'shish usuli mutlaqo o'zboshimchalik bilan amalga oshiriladi va siz noto'g'ri natija olishingiz mumkin:
Salom, salom, dunyo. rld.



Parallel bo'limda o'zgaruvchilar shaxsiy yoki umumiy bo'lishi mumkin: ' o’garuvchi har bir mavzu uchun shaxsiydir, ya'ni har bir
mavzu o'zining mahalliy nusxasiga ega bo'ladi. Shaxsiy o'zgaruvchi ishga tushirilmaydi va qiymat parallel hududdan tashqarida foydalanish uchun saqlanmaydi. Odatiy bo'lib, OpenMP sikl konstruktsiyalaridagi tsiklni takrorlash hisoblagichlari shaxsiydir.
umumiy: o'zgaruvchi umumiydir, ya'ni u bir vaqtning o'zida barcha oqimlarga ko'rinadi va ularga kirish mumkin. Odatiy bo'lib, ishni almashish mintaqasidagi barcha o'zgaruvchilar umumiy takrorlash hisoblagichidan tashqari umumiy hisoblanadi. Umumiy o'zgaruvchilardan ehtiyotkorlik bilan foydalanish kerak, chunki ular poyga sharoitlarini keltirib chiqaradi.
Shaxsiy yoki umumiy o'zgaruvchining turi #pragma omp dan keyin belgilanadi:
Misol:
int main (int argc, char *argv[]) {
int th_id, nthreads;
#pragma omp parallel private(th_id)
//th_id yuqorida e'lon qilingan. U shaxsiy sifatida ko'rsatilgan; shuning
uchun har bir
//mavzu o'z th_id nusxasiga ega bo'ladi
{
th_id = omp_get_thread_num();
printf("Salom dunyo %d\n mavzudan", th_id);
}

Shaxsiy yoki umumiymi? Ba'zan sizning algoritmingiz o'zgaruvchilarni almashishni talab qiladi, ba'zan esa shaxsiy o'zgaruvchilarni talab qiladi.


Almashish bilan ogohlantirish - bu poyga shartlari. Parallel algoritmning tafsilotlarini o'ylab ko'rish va o'zgaruvchilar turini ko'rsatish vazifasi, albatta, dasturchi zimmasiga tushadi.

OpenMP sizga iplarni qanday sinxronlashtirishni belgilash imkonini beradi. Mana nima mavjud:


: yopiq kod bloki bir vaqtning o'zida faqat bitta ish zarrachasi tomonidan bajariladi va bir vaqtning o'zida bir nechta ish zarrachalari tomonidan bajarilmaydi. U ko'pincha umumiy ma'lumotlarni poyga sharoitidan himoya qilish uchun ishlatiladi.
keyingi ko'rsatmada xotirani yangilash (yozish yoki o'qish- o'zgartirish-yozish) atomik tarzda amalga oshiriladi. U butun bayonotni atomga aylantirmaydi; faqat xotira yangilanishi atomik. Kompilyator kritikdan ko'ra yaxshiroq ishlash uchun maxsus apparat ko'rsatmalaridan foydalanishi mumkin.
tuzilgan blok iteratsiyalar ketma-ket tsiklda bajariladigan tartibda bajariladi.
: har bir ip jamoaning barcha boshqa iplari shu nuqtaga yetguncha kutadi. Ish almashish konstruktsiyasi oxirida yashirin to'siq sinxronizatsiyasiga ega.
: tayinlangan ishni tugatuvchi iplar jamoadagi barcha mavzular tugashini kutmasdan davom etishini bildiradi. Ushbu band mavjud
bo'lmaganda, ish almashinuvi konstruktsiyasi oxirida ish zarralari to'siq sinxronizatsiyasiga duch keladi.
Agar biz davom etishdan oldin barcha iplar bajarilishining ma'lum bir nuqtasida bo'lishini xohlasak, biz to'siqdan foydalanardik. To'siq asosan har bir mavzuni aytadi: "Boshqa barcha mavzular shu nuqtaga yetguncha shu erda kuting ...".
To'siq misoli: int main (int argc, char *argv[]) {
int th_id, nthreads;
#pragma omp parallel xususiy(th_id) {
th_id = omp_get_thread_num();
printf("Salom dunyo %d\n mavzudan", th_id);
#pragma omp to'sig'i < master chop etishdan oldin barcha
mavzular tugashini kutadi
if ( th_id == 0 ) {
nthreads = omp_get_num_threads();
printf("%d ta mavzular\n",nmavzular);
} }
}//asosiy
Yuqoridagi omp_get_num_threads() funksiyasiga e'tibor bering. Bu nima qilayotganini taxmin qila olasizmi? Boshqa ish vaqti funksiyalari quyidagilardir:
omp_get_num_threads omp_get_num_procs omp_set_num_threads
omp_get_max_threads





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