|
Raqamli texnologiyalar vazirligi muhammad al-xorazmiy nomidagi toshkent axborot texnologiyalari universiteti qarshi filiali “kompyuter injiniringi” fakulteti
|
bet | 9/13 | Sana | 25.05.2024 | Hajmi | 143,49 Kb. | | #253828 |
Bog'liq 1-amaliy ishOgohlantirish
Algoritmlar faqat statik, oddiy va yaqinlik boʻlimlari uchun parallel_for_eachtasodifiy kirish iteratorlaridan (masalan, std:: vektor ) foydalanadigan konteynerlarni qoʻllab-quvvatlaydi. parallel_transformIkki tomonlama va oldinga iteratorlardan foydalanadigan konteynerlardan foydalanish kompilyatsiya vaqtida xatolikka olib keladi. Standart ajratuvchi auto_partitionerbarcha uchta iterator turini qo'llab-quvvatlaydi.
Odatda bu chegaralovchilar xuddi shunday ishlatiladi, bundan mustasno affinity_partitioner. Ko'pgina ajratuvchi turlari fuqaroligi yo'q va ish vaqti bilan o'zgartirilmaydi. Shuning uchun, ushbu ajratuvchi ob'ektlar quyidagi misolda ko'rsatilganidek, qo'ng'iroq joyida yaratilishi mumkin.
C++Nusxalash
// static-partitioner.cpp
// compile with: /EHsc
#include
using namespace concurrency;
void DoWork(int n)
{
// TODO: Perform a fixed amount of work...
}
int wmain()
{
// Use a static partitioner to perform a fixed amount of parallel work.
parallel_for(0, 100000, [](int n) {
DoWork(n);
}, static_partitioner());
}
Biroq, algoritm keyingi tsikllarda qayta foydalanish uchun holatni saqlashi uchun ob'ektni affinity_partitionerdan boshqa I-qiymatiga havola sifatida o'tkazish kerak . constQuyidagi misol ma'lumotlar to'plamida bir xil amalni parallel ravishda bir necha marta bajaradigan asosiy dasturni ko'rsatadi. Undan foydalanish affinity_partitionerunumdorlikni yaxshilaydi, chunki massiv keshlanishi mumkin.
C++Nusxalash
// affinity-partitioner.cpp
// compile with: /EHsc
#include
#include
using namespace concurrency;
using namespace std;
int wmain()
{
// Create an array and fill it with zeroes.
array data;
data.fill(0);
// Use an affinity partitioner to perform parallel work on data
// that is likely to remain in cache.
// We use the same affinitiy partitioner throughout so that the
// runtime can schedule work to occur at the same location for each
// iteration of the outer loop.
affinity_partitioner ap;
for (int i = 0; i < 100000; i++)
{
parallel_for_each(begin(data), end(data), [](unsigned char& c)
{
c++;
}, ap);
}
}
Diqqat!
Agar chegaralovchilardan yoki dan foydalanganda birgalikda blokirovka semantikasiga bog'liq bo'lgan mavjud kodni o'zgartirsangiz affinity_partitioner, ehtiyotkorlik bilan foydalaning. Bu ajratgichlar yuk balansini yoki diapazonni uzatishni ishlatmaydi va shuning uchun dastur harakatini o'zgartirishi mumkin.
Har qanday stsenariyda ajratgichni ishlatish yoki ishlatmaslikni aniqlashning eng yaxshi usuli tajriba va odatdagi ish yuklari va kompyuter konfiguratsiyasi ostida operatsiyalarni bajarish uchun qancha vaqt ketishini o'lchashdir. Misol uchun, statik qismlarga ajratish kam sonli yadroli kompyuterda ishlashni sezilarli darajada tezlashtirishi mumkin, ammo nisbatan ko'p yadroli kompyuterlarda ishlashni sekinlashtiradi.
|
|
Bosh sahifa
Aloqalar
Bosh sahifa
Raqamli texnologiyalar vazirligi muhammad al-xorazmiy nomidagi toshkent axborot texnologiyalari universiteti qarshi filiali “kompyuter injiniringi” fakulteti
|