Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50562 Library:100020 in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: Cannot modify header information - headers already sent by (output started at /home/www/novacisko.cz/subdomains/bredy/init.php:11) in /home/www/novacisko.cz/subdomains/bredy/index.php on line 38
Jak na paralelní překlad ve VC8 - Bredyho blog - Ondřej Novák
Bredyho blog - Ondřej Novák

Jak na paralelní překlad ve VC8

Máte doma procesor s DualCore? Nebo snad máte víc jader? A vadí vám, že VC8 Express moc dobře nevyužije tuto vlastnost? Závidíte linuxakům příkaz make -jN? Mám pro Vás dobrou zprávu.


Paralelní překlad

Visual Studio 8 kupodivu umí spouštět překlad paralelně, ale umí to jen v rámci samostatných projektů, které navíc nejsou navzájem závislé. Vlastnost najdete v Options

vc8express_parallel1.gif

bohužel, v rámci projektu nelze paralelní překlad na dvou a více jádrech použít.

Utilitka

Z toho důvodu jsem si napsal malý prográmek, který převezme překlad a rozdělí job na několik samostatných podjobů, které spustí paralelně. Program si můžete stáhnout přímo v tomto článku

VC8ParallelBuild.zip Program pro překlad C++ zdrojových souborů paralelně

Jak to nainstalovat

Aby IDE překládalo C++ pomocí tohoto prográmku, je nutné jej nejprve někam zkopírovat. Vytvořte si kdekoliv na disku adresář, kam rozbalte zip archiv.

Následně otevřete soubor .VCParallel. Najdete v něm něco takovéto:

cmd "C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe" priority below_normal threads 6

Jedná se vlastně o parametry programu cl.exe. Program sám osobě má parametry naprosto stejné jako originální cl.exe. Proto je třeba jej konfigurovat pomocí externího souboru.

cmd
určuje jméno souboru originálního cl.exe. Doporučuji nechat v uvozovkách
priority
nastavuje prioritu spouštěného překladače. Možné varianty jsou idle,below_normal,normal,above_normal,high. Doporučuji nechat below_normal.
threads
určuje maximální počet překladů spuštěných naráz. Samozřejmě, že to může být ve výsledku méně, pokud není k dispozici tolik souborů k překladu.

Soubor .VCParallel lze umístit do složky s cl.exe nebo do složky c:\documents and settings\<jmeno uzivateke>\Application data (do rootu téhle složky).

Jakmile je program rozbalen a nastaven, stačí cestu na tento program zadat v okně options:

vc8express_parallel2.gif

Jak to funguje?

Je to celkem jednoduchý program. Hlavní část tvoří parsovač argumentů. Program musí poznat přepínače a soubory k překladu. Program pracuje pouze s parametry v listech @ (viz help k přepínači @), který se používá výhradně v IDE. Parametry předpokládá zadané v kódové stránce UNICODE.

Jakmile je rozparsován příkazový řádek jobu, je job rozdělen do podjobů. Každý job obsahuje stejné přepínače, pouze seznamy souborů jsou rozsekané do jednotlivých podjobů. Pak už stačí spustit několik instancí originálního překladače a předat mu upravené parametry. Nakonec se počká, až všechny překladače dokončí svou práci.

Pokud překlad skončí chybou, přebírá se poslední sebraný chybový kód a tento je pak vrácen jako chybový kód celého překladu.

Na jednom jádře?

Možná to zní divně, ale paralelní překlad může urychlit překládání i na PC o jednom jádře. Do hry totiž ještě vstupují IO operace. Pokud program čeká na data z disku, procesor může mezitím zpracovávat jiný úkol. Proto má smysl spouštět překlad paralelně i v tomto případě. Na dvoujádrovém procesoru se vyplatí zvyšovat zatížení procesoru dvakrát i třikrát. V příkladu je uvedena hodnota 6, kde připadá na jedno jádro 3 procesy. Povšimněte si ale prosím priority. Pokud máte hodně paměti, klidně si můžete dovolit přetěžovat procesor. Priorita below_normal způsobí, že odezva počítače nebude nijak postižena, protože všechny ostatní aplikace běží v prioritě normal a mají tedy vyšší prioritu než překlad v pozadí. Pokud tedy spustíte např. 20 paralelních překladů, zpomalí se maximálně překlad jednoho jobu (ovšem za tu cenu, že se překládá 20 jobu naráz, bude zpomalení v nejhorším případe dvacetinásobné na job, ale v praxi bude rozhodně nižší), ale nezpomalí to reakce počítače.

Závěrem

Užijte si to. Chyby hlaste, ale jelikož máte zdrojáky, tak úpravy ve zdrojácích mi prosím pošlete, ať je mohu aktualizovat na těchto stránkách.

vytvořeno: 22.8.2007 20:56:59, změněno: 22.8.2007 20:56:59
Jsou informace v článku pro Vás užitečné?
  • (1)
  • (1)
  • (1)
  • (0)
  • (0)
Nick nebo OpenID
Vzkaz
 
25.7.2016 20:14:21

CrrnDr3t2y0

Ho ho, who woldua thunk it, right?
9.3.2008 20:24:44

Bredy

Děkuji za informaci, o /MP[n] jsem dosud nevěděl. Ale fakt tam je, což potvrzuju. Mé řešení navíc umí volit prioritu a nová verze (která tu ještě není) bude umět i hlídat limit paměti. Pokud hrozí, že dojde volná paměť, zastaví všechny joby a nechá běžet jen jeden, dokud je paměti nedostatek. Navíc donutí ostatní joby odswapovat, což trošku uvolní paměť. Hodně to urychlí překlad v době takovýhle špiček, které jsou dost kritické. To že nefungují PCH nevím. Já to používám i s PCH, dokonce s vícero v rámci jednoho projektu. Generování PCH samozřejmě neběží paralelně, ale jinak je bez problémů. Pokud se Vám stane, že se to nějak předbíhá, tak tam máte nějakou chybu v nastavením projektu. Tenhle program rozhodně neřeší pořadí, pouze věci, ktere z visualka vypadnou jako job pustí vedle sebe. PCH často padá jako job o jednom souboru.
8.3.2008 03:00:01

j.durech

Zaujimave riesenie, ale zial nefunguje s precompiled headrami (nestudoval som podrobne vas zdrojovy kod, ale myslim, ze sa tam spusti dalsi job skor, ako sa stihne vytvorit potrebny PCH).

Kazdopadne, prave som vygooglil, ze VS2005 ma nezdokumentovany prepinac /MP[n], ktory je uz vo VS2008 oficialny.

PS: jo a mate tu vskutku hodnotne informacie, klobuk dolu:)

Podobné články

FastAllocPool - urychlení častých alokací a dealokací

Pokud v programu z nějakých důvodů potřebujeme často provádět new a delete nad některými třídami, můžeme zvýšit efektivitu těchto operací zavedením poolu předalokované paměti

MultiThread 2

Knihovna MultiThread-2.0

Ceník

Kolik to bude stát

Vracíme z funkce objekty - problémy

Při praktickém používání technik Vracíme z funkce objekty narazíme na nečekané a možná nelogické problémy.
Reklama: