abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 05:11 | Komunita

    Během tradiční ceremonie k oslavě Dne vzniku samostatného československého státu (28. října) byl vyznamenán medailí Za zásluhy (o stát v oblasti hospodářské) vývojář 3D tiskáren Josef Průša. Letos byly uděleny pouze dvě medaile Za zásluhy o stát v oblasti hospodářské, druhou dostal informatik a manažer Ondřej Felix, který se zabývá digitalizací státní správy.

    Gréta | Komentářů: 8
    dnes 04:44 | Nová verze

    Tor Browser, tj. fork webového prohlížeče Mozilla Firefox s integrovaným klientem sítě Tor přednastavený tak, aby přes tuto síť bezpečně komunikoval, byl vydán ve verzi 15.0. Postaven je na Firefoxu ESR 140.

    Ladislav Hagara | Komentářů: 1
    včera 16:44 | Nová verze

    Bylo oznámeno (cs) vydání Fedora Linuxu 43. Ve finální verzi vychází šest oficiálních edic: Fedora Workstation a Fedora KDE Plasma Desktop pro desktopové, Fedora Server pro serverové, Fedora IoT pro internet věcí, Fedora Cloud pro cloudové nasazení a Fedora CoreOS pro ty, kteří preferují neměnné systémy. Vedle nich jsou k dispozici také další atomické desktopy, spiny a laby. Podrobný přehled novinek v samostatných článcích na stránkách Fedora Magazinu: Fedora Workstation, Fedora KDE Plasma Desktop, Fedora Silverblue a Fedora Atomic Desktops.

    Ladislav Hagara | Komentářů: 0
    včera 15:22 | IT novinky

    Elon Musk oznámil (𝕏) spuštění internetové encyklopedie Grokipedia (Wikipedia). Zatím ve verzi 0.1. Verze 1.0 prý bude 10x lepší, ale i ve verzi 0.1 je podle Elona Muska již lepší než Wikipedia.

    Ladislav Hagara | Komentářů: 12
    včera 05:44 | Komunita

    PSF (Python Software Foundation) po mnoha měsících práce získala grant ve výši 1,5 milionu dolarů od americké vládní NSF (National Science Foundation) v rámci programu "Bezpečnost, ochrana a soukromí open source ekosystémů" na zvýšení bezpečnosti Pythonu a PyPI. PSF ale nesouhlasí s předloženou podmínkou grantu, že během trvání finanční podpory nebude žádným způsobem podporovat diverzitu, rovnost a inkluzi (DEI). PSF má diverzitu přímo ve svém poslání (Mission) a proto grant odmítla.

    Ladislav Hagara | Komentářů: 23
    včera 04:55 | Nová verze

    Balík nástrojů Rust Coreutils / uutils coreutils, tj. nástrojů z GNU Coreutils napsaných v programovacím jazyce Rust, byl vydán ve verzi 0.3.0. Z 634 testů kompatibility Rust Coreutils s GNU Coreutils bylo úspěšných 532, tj. 83,91 %. V Ubuntu 25.10 se již používá Rust Coreutils místo GNU Coreutils, což může přinášet problémy, viz například nefunkční automatická aktualizace.

    Ladislav Hagara | Komentářů: 0
    27.10. 21:00 | IT novinky

    Od 3. listopadu 2025 budou muset nová rozšíření Firefoxu specifikovat, zda shromažďují nebo sdílejí osobní údaje. Po všech rozšířeních to bude vyžadováno někdy v první polovině roku 2026. Tyto informace se zobrazí uživateli, když začne instalovat rozšíření, spolu s veškerými oprávněními, která rozšíření požaduje.

    Ladislav Hagara | Komentářů: 0
    27.10. 17:11 | Humor

    Jste nuceni pracovat s Linuxem? Chybí vám pohodlí, které vám poskytoval Microsoft, když vás špehoval a sledoval všechno, co děláte? Nebojte se. Recall for Linux vám vrátí všechny skvělé funkce Windows Recall, které vám chyběly.

    Ladislav Hagara | Komentářů: 1
    27.10. 16:11 | Komunita

    Společnost Fre(i)e Software oznámila, že má budget na práci na Debianu pro tablety s cílem jeho vyžívání pro vzdělávací účely. Jako uživatelské prostředí bude použito Lomiri.

    Ladislav Hagara | Komentářů: 1
    26.10. 17:11 | IT novinky

    Proběhla hackerská soutěž Pwn2Own Ireland 2025. Celkově bylo vyplaceno 1 024 750 dolarů za 73 unikátních zranitelností nultého dne (0-day). Vítězný Summoning Team si odnesl 187 500 dolarů. Shrnutí po jednotlivých dnech na blogu Zero Day Initiative (1. den, 2. den a 3. den) a na YouTube.

    Ladislav Hagara | Komentářů: 5
    Jaké řešení používáte k vývoji / práci?
     (36%)
     (48%)
     (20%)
     (19%)
     (23%)
     (17%)
     (21%)
     (17%)
     (18%)
    Celkem 280 hlasů
     Komentářů: 14, poslední 14.10. 09:04
    Rozcestník

    Prepis utility MinetestMapper do C++ a benchmarky C++ / Py

    18.9.2012 22:50 | Přečteno: 1246× | Programovanie | poslední úprava: 18.9.2012 22:51

    V lete počas najvyšších teplôt som narazil na malý problém s mojim súkromným minetest serverom. Používal som nástroj minetestmapper.py pre generovanie obrázku z aktuálnej mapy. Vygenerovanie mapy s týmto nástrojom trvalo približne hodinu, čo spôsobovalo prehrievanie CPU. Preto (a samozrejme aj zo zvedavosti) som sa rozhodol prepísať tento nástroj do C++. Dnes som sa tento program pokúsil použiť ako malý nesytetický benchmark kompilátorov. Okrem neho v blogu nájdete zopár informácií o fungovaní hry minetest.

    O hre minetest

    Minetest je slobodný klon hry minecraft napísaný v C++. Zdrojové kódy hry sú dostupné na Github-e. Aplikácia používa engine irrlicht. Skriptovanie je možné v jazyku LUA, možnosti sú však zatiaľ dosť obmedzené kvôli chýbajúcemu API. Napriek spomínaným obmedzeniam v tejto hre vznikajú podobné „divočiny“ ako v pôvodnom minecrafte. Malú ukážku je možné nájsť v minetest fóre.

    Minetest Minetest

    Mapa

    Celá hra minetest je podobne ako minecraft založená na voxeloch (obdoba pixelov v 3D). Mapa sa skladá z kociek pevnej veľkosti, ktoré môžu byť rozmiestnené len na presných pozíciách v štvorcovej mriežke.

    Svet môže mať rozmery 4096 blokov vo všetkých 3 rozmeroch. Každý blok sa skladá z 16 ∗ 16 ∗ 16 voxelov. Svet môže mať teda rozmery 65536 ∗ 65536 ∗ 65536 (281 474 976 710 656) voxelov. Pri takomto množstve voxelov samozrejme nie je možné rozumne pracovať s celou mapou a tak mapa obsahuje len už vygenerované v minulosti použité bloky.

    Mapa

    Ukladanie mapy

    V aktuálnej verzii minetestu sa mapa ukladá do SQLite databázy (áno čítate správne). Databáza obsahuje jedinú tabuľku s dvomi stĺpcami - pos (long) a data (blob). V stĺpci pos sú zakódované všetky 3 súradnice. Súradnice sú 12-bitové signed čísla, spolu zaberajú 36 bitov, čo sa bez problémov zmestí do 64-bitového typu long.

    Štruktúra dát

    Prvých 8 bitov každého bloku obsahuje číslo verzie. Pri ďalšom popise budem predpokladať, že obsahuje najnovšiu verziu. Po pár-bytovom offsete nasledujú dva bloky dát komprimované zlib-om. Pre generovanie mapy je pre nás podstatný len prvý obsahujúci 16 ∗ 16 ∗ 16 16-bitových čísel (až sa vám to zdá šialene nadýchnite sa na chvíľu, lebo to čo príde rozhodne nebude pekné), ktoré odkazujú do tabuľky materiálov bloku (k tej sa dostanem v nasledujúcom odseku).

    Po prečítaní (a zahodení) metadát sa dostaneme k tabuľke materiálov. Každý blok má svoju vlastnú tabuľku materiálov, čo je zoznam dvojíc id materiálu - názov materiálu. ID je 16-bitové číslo a názov je reťazec maximálnej dĺžky 65536 znakov. Základné materiály majú anglické názvy ako „air“, „water“, „sand“ … Materiály definované v skriptoch majú väčšinou tvar prefix_skriptu:názov.

    Prevod materiálov na farbu

    Materiály sa prevádzajú na farbu podľa konfiguračného súboru colors.txt. Prvá položka riadku je názov materiálu, za ktorým nasledujú hodnoty červenej, zelenej a modrej farby. Celý prevod materiálu voxelu na farbu vyzerá teda nasledovne:

    Generovanie obrázku mapy

    Pri generovaní obrazu sú voxely mapované presne na pixely. Pre každý pixel mapy je potrebné najskôr nájsť neprehľadný materiál na najvyššej pozícii na y-ovej osi. Podľa materiálu sa na danej x a z pozícii vykreslí pixel.

    Počas vykresľovania obrazu sa pre každý pixel zaznamenáva aj y súradnica. Podľa nej sa následne vykresľuje tieňovanie terénu.

    Pôvodný minetest mapper

    Pôvodný generátor mapy je napísaný v pythone. Najviac procesorového času je tu spotrebovaného na jednoduché operácie ako bitové posuny, logický OR, posuny v streame … Tie sú v C++ vykonávané väčšinou 1 taktom CPU. Python však interpretuje bytecode a každá jednoduchá operácia preto trvá niekoľko taktov CPU.

    Nasledujúce časy sú namerané pre moju malú testovaciu mapku (752px ∗ 512px). Testovací stroj ma CPU Intel Core2 Duo T5250 (1.5GHz):

    Interpret Čas
    Python 2.7 120,04s
    PyPy 1.9 s JIT 87s

    Benchmarkujeme minetest mapper v C++

    Môj pomerne chaotický prepis Python verzie do C++ je možné nájsť na Github-e. Kód nie je úplne ekvivalentný, ale výstup je takmer na pixel rovnaký (python verzia má nejaký bug, ktorý sa mi nepodarilo opraviť).

    Pri benchmarkovaní bol každý test spustený 50x. Meraný bol čas od spustenia po ukončenie aplikácie (tj. nie len procesorový čas, ale aj I/O a čas strávený systémovými volaniami). Pri optimalizácii O1 a vyššie bol zapnutý flag -march core2. Súhrnné výsledky sú v nasledujúcej tabuľke.

    Kompilátor Priemer Interval spoľahlivosti (90%) Minimálny čas Maximálny čas
    gcc-4.5 (O0) 2.515 2.486 - 2.544 2.489 2.576
    gcc-4.6 (O0) 2.523 2.498 - 2.549 2.497 2.573
    gcc-4.6 (O0, lto) 2.518 2.495 - 2.541 2.493 2.545
    gcc-4.7 (O0) 2.553 2.529 - 2.577 2.532 2.577
    gcc-4.7 (O0, lto) 2.541 2.518 - 2.563 2.519 2.571
    llvm-3.1 (O0) 2.464 2.425 - 2.502 2.435 2.586
    gcc-4.5 (O1) 1.525 1.508 - 1.541 1.509 1.548
    gcc-4.6 (O1) 1.517 1.503 - 1.531 1.503 1.532
    gcc-4.6 (O1, lto) 1.498 1.475 - 1.520 1.480 1.519
    gcc-4.7 (O1) 1.469 1.452 - 1.487 1.452 1.505
    gcc-4.7 (O1, lto) 1.484 1.469 - 1.500 1.468 1.504
    llvm-3.1 (O1) 1.648 1.629 - 1.666 1.631 1.669
    gcc-4.5 (O2) 1.443 1.423 - 1.462 1.428 1.484
    gcc-4.6 (O2) 1.441 1.425 - 1.458 1.425 1.467
    gcc-4.6 (O2, lto) 1.439 1.424 - 1.454 1.424 1.456
    gcc-4.7 (O2) 1.456 1.439 - 1.473 1.441 1.478
    gcc-4.7 (O2, lto) 1.443 1.424 - 1.462 1.428 1.491
    llvm-3.1 (O2) 1.420 1.405 - 1.435 1.405 1.442
    gcc-4.5 (O3) 1.424 1.408 - 1.440 1.408 1.448
    gcc-4.6 (O3) 1.438 1.422 - 1.455 1.421 1.457
    gcc-4.6 (O3, lto) 1.439 1.422 - 1.456 1.422 1.459
    gcc-4.7 (O3) 1.443 1.427 - 1.459 1.426 1.462
    gcc-4.7 (O3, lto) 1.442 1.425 - 1.460 1.429 1.467
    llvm-3.1 (O3) 1.418 1.401 - 1.436 1.404 1.439
    gcc-4.5 (OS) 1.568 1.549 - 1.588 1.552 1.591
    gcc-4.6 (OS) 1.562 1.544 - 1.581 1.546 1.610
    gcc-4.6 (OS, lto) 1.531 1.510 - 1.551 1.510 1.555
    gcc-4.7 (OS) 1.563 1.547 - 1.579 1.544 1.582
    gcc-4.7 (OS, lto) 1.566 1.550 - 1.583 1.549 1.587
    llvm-3.1 (OS) 1.452 1.437 - 1.467 1.436 1.474

    Nasledujúci graf je vizualizáciou tabuľky. Priemer je znázornený čiernou značkou. Obdĺžnik je 90% interval spoľahlivosti. Vrchné a spodné modré značky sú minimálnou a maximálnou nameranou hodnotou.

    Benchmark

    Kód prepísaný do C++ je na mojom stroji približne 60x rýchlejší než python kód.

    Prvenstvo v rýchlosti kódu napriek mojim odhadom nezískalo g++ so zapnutou link time optimalizáciou, ale relatívne mladý kompilátor llvm s frontendom clang.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    18.9.2012 23:06 tom
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Nechcete to prelozit a zmerit jeste pro pripad, kdy ma gcc k dispozici data z profileru (-fprofile-use)?
    mirec avatar 18.9.2012 23:17 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Profiler ma nenapadol. Ak na to nezabudnem doplním.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    mirec avatar 19.9.2012 18:50 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py

    gcc 4.7 s -O3 a -lto má s -fprofile-use (samozrejme predtým som spúšťal s -fprofile-generate) prakticky totožné výsledky ako v testoch v blogu: priemer 1.4497, int. spoľahlivosti 90% 1.4283-1.4717, min 1.427, max 1.494.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    19.9.2012 00:12 Radek Podgorny | skóre: 16
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    ...a nema python na tyhle bitove hratky nejake moduly (tedy implementace v c)?
    mirec avatar 19.9.2012 08:44 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Na prácu s maticami a vektormi má celkom slušný balík numpy. Preberal som to s jedným pythonistom (ja som tiež programátor v pythone, ale robím skôr webové veci než algoritmy) a čiste teoreticky by sa to mohlo dať urýchliť použitím numpy. Problematické sú operácie na úrovni pixelov kde sa spracovanie podobá na fragment shadery na grafike. Teoreticky by sa to mohlo dať spracovať rozdelením bloku na 16 výškových vrstiev a potom pre každý pixel počítať farbu a aplikovať na pixmapu s maskovaním už vykreslených pixelov. Operácii by bolo síce viacej, ale vyhol by som sa tak podmieneným skokom. Na najnižšej úrovni by bolo vhodné funkciu aplikovanú na pixely prepísať do C.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    19.9.2012 15:43 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Na najnižšej úrovni by bolo vhodné funkciu aplikovanú na pixely prepísať do C.
    Ještě lepší variantu představuje cython, kde je snadné přepsat jenom tu kritickou část do ekvivalentního C-like staticky typovaného kódu.
    When your hammer is C++, everything begins to look like a thumb.
    19.9.2012 00:30 xanax
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    takychto clankov by tu malo byt viac
    Heron avatar 19.9.2012 16:31 Heron | skóre: 53 | blog: root_at_heron | Olomouc
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Proč má každý blok svoji vlastní tabulku (to je tedy zřejmně onen druhý blok dat v jednom záznamu) materiálů?
    Po prečítaní (a zahodení) metadát sa dostaneme k tabuľke materiálov. Každý blok má svoju vlastnú tabuľku materiálov
    Jinak chválím použití SQLite. Je to lepší, než vymýšlet vlastní yet another db a potýkat se s problémy, které jsou už dávno vyřešené.
    mirec avatar 19.9.2012 18:33 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Proč má každý blok svoji vlastní tabulku (to je tedy zřejmně onen druhý blok dat v jednom záznamu) materiálů?

    Neviem prečo má vlastnú tabuľku keď by sa to dalo riešiť goláblnou. Druhý blok komprimovaných dát sú metadáta, čo je key-value datastore na rôzne účely (napr. rôzne krabice, vlaky ... používajú položku "inventory" pre záznam objektov uložených v inom objekte). Tabuľka je uložená až za metadátami v nekomprimovanej forme.

    Jinak chválím použití SQLite. Je to lepší, než vymýšlet vlastní yet another db a potýkat se s problémy, které jsou už dávno vyřešené.

    Táto implementácia je len prenesenie pôvodnej súborovej implementácie do databázy. Prvé verzie mali mapu uloženú ako množstvo malých súborov s rovnakým názvom ako stĺpec pos v databáze a rovnakým obsahom ako stĺpec data.

    SQLite je dobrá keď má obsluhovať jedného klienta. V minetest serveri sa mi zdá, že je diskové IO hlavnou prekážkou väčšieho množstva hráčov.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    Josef Kufner avatar 25.9.2012 23:06 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    SQLite je dobrá keď má obsluhovať jedného klienta. V minetest serveri sa mi zdá, že je diskové IO hlavnou prekážkou väčšieho množstva hráčov.
    S jakoukoliv databází na disku nemáš šanci. Tohle musíš udržet v paměti a čas od času (jednotky minut) udělat záložní kopii na disk. Pokud máš návaznost na okolní svět (jiná aplikace), tak pak držet záznam o provedených operacích pro případný rollback nebo rekonstrukci.
    Hello world ! Segmentation fault (core dumped)
    Josef Kufner avatar 25.9.2012 23:07 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Btw, jak moc se takovýhle svět dá počítat na grafické kartě? IMHO se tady extrémní paralelismus docela hodí.
    Hello world ! Segmentation fault (core dumped)
    mirec avatar 26.9.2012 11:28 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Prepis utility MinetestMapper do C++ a benchmarky C++ / Py
    Niektoré operácie by určite išli krásne vektorizovať. Grafiky by mali byť aj celkom slušne optimalizované na z-buffer test. Výkon by podľa mňa mohlo zabiť len používanie asociatívnych polí, ale ak by CPU robil len načítavanie a preklad ID materiálov na farby a zvyšok by robila grafika mohlo by sa to tak o 50% zrýchliť (vychádzam z hodnôt nameraných callgrind-om).
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.