kategorie:

menu:


Jak uvařit procesor

04.10.2009   ::    topic: Programování

V předmětu Problémy a algoritmy jsme dostali za úkol vymyslet a implementovat algoritmus řešící problém batohu.

Vcelku odpočinková záležitost, implementaci hladovým algoritmem jsem měl hotovou již během cvičení. Na koleji jsem pak dopsal řešení hrubou silou (pomocí rekurze). Při přemýšlení jak to udělat co nejrychleji mě napadlo napsat rekurzi způsobem aby každá iterace běžela ve vlastním vlákně (každé vlákno s vlastní kopií dat). První implementaci jsem napsal bez omezení počtu spouštěných vláken, do baťohu naházel něco kolem 20 věcí a program spustil.

Trochu jsem to nedomyslel do důsledků, při dané konfiguraci to znamená spuštění něco přes milión vláken (pokud nejsou odbavována hodně rychle). Systém začal mít po pár vteřinách nesnesitelné latence, po dalších asi deseti vteřinách na mě vyskočila černá konzole s nápisem „halt“… Ani jsem si nestihl přečíst předcházející logovací hlášky a notebook se vypnul (to nebylo jádro, ale hw).

Chvíli jsem na to koukal s otevřenou pusou, po bootu jsem okamžitě hledal příčinu pádu. Soubor /var/log/kern.log končil následujícím:

Sep 28 12:53:52 myKubuntu kernel: [38901.142829]
               ath5k phy0: noise floor calibration timeout (2437MHz)
Sep 28 12:59:05 myKubuntu kernel: [39213.659596]
               ACPI: EC: missing confirmations, switch off interrupt mode.
Sep 28 12:59:34 myKubuntu kernel: [39243.031927]
               Critical temperature reached (144 C), shutting down.
Sep 28 12:59:50 myKubuntu kernel: [39258.732920]
               ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] 20090521 evregion-424

Po přečtení těchto zpráv jsem nechápal ještě víc… Něco podobném jsem na standardně nakonfigurovaném hardwaru ještě neviděl. Vždy jsem žil v domnění že s fungujícím chlazením se tohle nikdy nemůže stát… Až příště budu programovat rekurzi, pokusím se být na svůj procesor hodnější.

Program jsem přepsal aby byl počet spuštěných vláken limitovaný. Zkuste si jej ale stáhnout a nastavit proměnnou THREAD_LIMIT na false :)