Portál AbcLinuxu, 30. dubna 2025 16:53
for (i = 0; i < count; i++) { //dělej něco s i }ve kterém nezáleží na pořadí provádění jednotlivých iterací. Pak ji můžeme paralelizovat takhle:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(count, queue, ^(size_t i) { //dělej něco s i });dispatch_apply vytvoří count lambda výrazů a každému z nich předa příslušnou hodnotu parametru i (tím se z nich stanou bloky) a hodí je do fronty. Blok je closure, ani nevím, jak se to řekne česky. Skončí až se celá fronta vyprázdní. Blok nemusí být definován přímo v seznamu parametrů, tzn. jako anonymní, deklaruje a definuje se velice podobně jako ukazatel na funkci. Místo hvězdičky se píše stříška. Je to edy syntaktické rozšíření C, C++ a Objective-C. Více k tomu zde. C++0x lambdy vypadají jinak a nejsou closure. To je celý základ, zbytek je omáčka okolo- lze definovat callback, který se zavolá po dokončení bloku, lze použít semafory k omezení přístupu k limitovaným zdrojům jako např. připojení k databázi, fronty lze pozastavit, určit priority... Čekali jste něco, co samo pozná, co se kde dá paralelizovat, vyřeší race conditions a deadlocky? Doufám, že ne páč se nic takového nekoná. Čekali jste zajímavou implementaci abstrakce nad thready s plánováním ne na úrovni procesu ale na úrovni celého systému? Pak jste se trefili. Největším problémem GCD podle mně je, že je ukrutně platformově závislý. V multiplatformních aplikacich se to z toho důvodu asi moc používat nebude.
Tiskni
Sdílej:
MS CR nestoji na lambda výrazech. CR můžete používat i bez lambda, ale je to opruz -- prakticky stejně smutný případ jsou algoritmy v C++ STL.
Něco podobného umožňuje OMP, kde ten paralelismus vyjádříte pomocí #pragma (v C++) anotací a kompilátor si obstará veškerou "administrativu", jako správu vláken, dělení úlohy mezi vlákna, redukce, atd. Tuším, že úloha z MS dokumentace by vypadala přibližne takhle
array<int, 5> values = { 1, 2, 3, 4, 5 };
#pragma omp parallel for
for(int i = 0; i < 5; i++) {
values[i] *= values[i];
}
Největším problémem GCD podle mně je, že je ukrutně platformově závislý.Jezkovy... to je prave jeho nejvetsi vyhodou. Jak jsi sam psal, v principu to neni nic zas tak prevratneho. V cem to ale prevratne je, je prave ta integrace do systemu a dostupnost pro kazdeho vyvojare a program pouzivajici 10.6. To same OpenCL. Nemusis resit nejaky vyber knihoven, verzi a podobnych kravin. Poridis si 10.6, na web napises, ze ho tvuj SW vyzaduje a tecka. Proc by to mel Apple delat multiplatformni? Co by z toho mel?
Ano, jistota, že každý uživatel 10.6 má GCD je výhodou. Optimistický odhad Applu je, že do roka bude mít 10.6 40 % uživatelů takže teď bude vytvářet aplikaci závislou na GCD jen dobrodruh. Není to nic proti Apple, naopak je to super výkon, za tři roky přešlo na Vistu jen 23 % uživatelů Windows. Stejně tak je super, že každý uživatel Windows má .net framework hned po instalaci systému. Jak to ale souvisí s větou, na kterou reaguješ?
Tu poslední otázku doufám nemyslíš vážně. Vzhledem k množství multiplatformního softu pro Mac OS je mimořádně hloupá.
Stejně tak je super, že každý uživatel Windows má .net framework hned po instalaci systému.To je asi tak super, jako ze kazdy uzivatel Mac OS X ma Cocoa hned po instalaci systemu, nebo to same s Ubuntu a GTK+
Jak to ale souvisí s větou, na kterou reaguješ?Souvisi to s ni tak, ze kdyby GCD mel byt multiplatformni, bylo by mnohem tezsi ho tolik zadratovat do systemu. Vzhledem k rozdilum mezi kernely jednotlivych mainstream OS...
Tu poslední otázku doufám nemyslíš vážně. Vzhledem k množství multiplatformního softu pro Mac OS je mimořádně hloupá.Tak jeste jednou. Co by Apple mel z toho, kdyby GCD delal multiplatformni? Kudy by se mu vratily investice do takoveho podniku? Ze by multiplatformni aplikace, ktere jsou mj. i pro Mac, mohly pouzivat GCD i jinde nez na Macu? ...
Využívat můžou ale dělat to nebudou. Pochybuju, že by kvůli jediné platformě začal v těch nejhlubších výpočetních vrstvách aplikace někdo #IFDEFovat.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.