-
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!news.task.gda.pl!not-for-mail
From: Edek <e...@g...com>
Newsgroups: pl.comp.programming
Subject: Re: Podpis cyfrowy większej ilości podmiotów
Date: Mon, 15 Apr 2013 14:49:56 +0000 (UTC)
Organization: CI TASK http://www.task.gda.pl/
Lines: 101
Message-ID: <kkh42k$81t$1@news.task.gda.pl>
References: <kkdqot$5rl$1@node2.news.atman.pl> <kkdtr5$9n9$1@node1.news.atman.pl>
<2...@g...com>
<kkec03$n4h$1@node2.news.atman.pl>
<a...@g...com>
<kkfd89$o9b$1@news.task.gda.pl>
<0...@g...com>
NNTP-Posting-Host: 178-36-247-220.adsl.inetia.pl
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: news.task.gda.pl 1366037396 8253 178.36.247.220 (15 Apr 2013 14:49:56 GMT)
X-Complaints-To: a...@n...task.gda.pl
NNTP-Posting-Date: Mon, 15 Apr 2013 14:49:56 +0000 (UTC)
User-Agent: Pan/0.139 (Sexual Chocolate; GIT bf56508 git://git.gnome.org/pan2)
Xref: news-archive.icm.edu.pl pl.comp.programming:202580
[ ukryj nagłówki ]Dnia Sun, 14 Apr 2013 21:10:46 -0700 po głębokim namyśle M.M. rzekł:
> W dniu poniedziałek, 15 kwietnia 2013 01:14:17 UTC+2 użytkownik Edek
> napisał:
>
> Zaraz zaczniemy się "kłócić" o to gdzie leży granica pomiędzy
> optymalizacją algorytmiczną a implementacyjną :)
Jedna często wymusza drugą.
>> Właśnie nie, dobrze napisany w C++ kod będzie odporny na działanie
>> czasu. Jedynie trzeba założyć jakiś margines fluktuacji.
> Zgodzę się że będzie, ale dodam, że nie ma cudów. Dobrze napisany kod w
> C++ nawet będzie coraz lepszy, bo kompilatory się wciąż rozwijają, a kto
> wie, może twórcy procesorów zaczną procesory robić tak, aby szybciej
> wykonywały taki kod, jaki kompilator jest w stanie wygenerować. Ale
> właśnie nie ma cudów. Kompilator sam nie zorientuje się, że w takich
> szachach mamy 64 pola na planszy i docelowy procesor też ma 64 bity w
> rejestrze. Kompilator nie zmieni sam szachownica[64], na kilka masek z
> long long.
Procesory tak się rozwijają. M.in. Haswell i wcześniejsze są znacznie
bardziej tolerancyjne dla kiepskiego kodu. Wykonują kod szybciej
nie dlatego, że mają nowe istrukcje - chociaż to też - tylko np.
lepiej sobie radzą z odczytem częściowych słów jak i maskowaniem
przy użyciu części słowa. To powoduje, że można czytać drugiego
shorta a odczyt pierwszego shorta będzie niezależny i branch prediction
pozwoli obie instrukcje wykonywać równocześnie - a wcześniej drugi
short maskował pierwszego i ten wzór wykonywał się wolniej ze względu
na fałszywą zależność danych. Jest mnóstwo takich drobnych różnic.
To prawda, że kompilator sam nie zamieni booleanów na rejestr
bitów, ale można by już sprawdzić czy bitset nie ma implementacji
takiej, że to zadziała automagicznie. Twórcy kompilatorów tylko
na to poświęcają mnóstwo swojego czasu, często więcej niż
pojedynczy programista jest w stanie poświęcić na swój kod.
Optymalne jest wykorzystanie włąsciwości kompilatora i dopisanie
ręcznie tego, czego kompilator nie załatwia. W zasadzie dopiero
rozumiejąc kompilator można faktycznie poznać procesor - ja
sam często odkrywam, że to co wygląda fatalnie na pierwszy
rzut oka jest celowym działaniem desantu intela w gcc i hula
jednak lepiej.
> Teraz pytanie: czy zmiana struktury danych z szachownica[64], na
> bierki[12] jest optymalizacją implementacyjną czy algorytmiczną?
Taką i taką, jeżeli zmiana użytych prymitywów wpływa na algorytm.
Jako praktyk powiem, że jak zwał tak zwał, ma działać :). Z teoretycznego
punktu widzenia już nie wystarczy uwzględniać złożoności algorytmicznej,
bo sprzęt ma bardzo skomplikowane właściwości.
W zasadzie zamiana bool[38] na bitset[38] to "implementacyjna"?
> Na pewno bierki[12] nie jest dobrze napisanym programem w C++, bo jak
> gdzieś long long nie będzie 64-bitowy, to może nie działać.
Stosuje się alternatywne implementacje fragmentów sprawiających kłopot.
>> Dochodzi też margines opłacalności - programista często kosztuje więcej
>> niż sprzęt (heh, powiedziałem co wiedziałem ;).
> Właśnie dlatego że eksperymentowanie jest bardzo drogie i czasochłonne,
> chciałbym wiedzieć od razu jaka implementacja okaże się najlepsza :)
I bardzo dobrze, zawsze lepiej pomyśleć przed a nie tylko po.
>> Poza HPC i paroma niszami nikomu nie zależy na +-10% jeżeli jest to
>> kosztem funkcjonalności. Jeszcze jeden wyjątek: kod działający na
>> milionach maszyn.
> Myślę że w szachach dzięki dobrej implementacji uzyskuje się
> przyspieszenie 2-4 razy a nie 10%. Test ataku na reprezentacji
> szachownica[64] to iterowanie po polach i cztery warunki do sprawdzania
> czy nie przekroczyliśmy zakresu, a na reprezentacji bitowej to kilka
> operacji logicznych i kilka odczytów masek z tablic.
Po pierwsze: cały program przyspieszył 2-4 razy czy fragment? Ja
mówiłem o całym. Po drugie szachy są niszą. Z tego co się orientuję
w innych analizach danych część ludzi wyciska każdy %, a część
używa Javy. Oba podejścia mają sens, ja preferuję "najpierw wygoda
a potem przepisujemy krytyczne algorytmy". Rozsądnie napisany kod nie
jest 2x wolniejszy od optymalnego, najczęściej jest w granicach 10-20%
max i 5-6% jako całość.
>> To jest sztuka. Nie jest sztuką próbować do skutku aż się znajdzie
>> optymalny przy tych a nie innych opcjach i wersji, tylko napisać tak,
>> żeby trzymał się w najlepszych 10%.
> Właśnie to jest pytanie czy idzie o te 10% czy o 200-400%. Weźmy naiwne
> mnożenie macierzy i zoptymalizowane. Jakie to są różnice?
> Coś mi się przypomina że 500% - 1000%.
Dobry przykład na porażkę teoretycznej złożoności bez uwzględnienia
sprzętu, tutaj cache.
Chciałbym coś odróżnić. Jest jedna granica pomiędzy naiwnym lub zepsutym
kodem a takim, który jest napisany rozsądnie. Druga granica dopiero
jest pomiędzy rozsądnym a "optymalizowanym". W tej pierwszej
usuwałem babole na 30x szybciej, w tej drugiej już +-10% to bardzo dużo.
Zaraz ktoś rzuci przykład małego algorytmu z lepszym zyskiem,
ale mam na myśli setki tysięcy linii kodu.
--
Edek
Następne wpisy z tego wątku
- 15.04.13 18:43 M.M.
- 15.04.13 21:40 firr kenobi
- 15.04.13 21:42 AK
- 15.04.13 23:23 Edek
- 16.04.13 08:39 AK
- 16.04.13 10:47 M.M.
- 16.04.13 12:49 bartekltg
- 16.04.13 15:01 Miroslaw Kwasniak
- 16.04.13 19:10 AK
- 17.04.13 00:36 Edek
- 17.04.13 09:48 M.M.
- 17.04.13 10:30 firr kenobi
- 17.04.13 11:21 M.M.
- 17.04.13 12:21 firr kenobi
- 17.04.13 12:29 firr kenobi
Najnowsze wątki z tej grupy
- Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
Najnowsze wątki
- 2025-01-06 Popr. 14. Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- 2025-01-06 Ostrów Wielkopolski => Area Sales Manager OZE <=
- 2025-01-06 Do IO i innych elektrooszolomow, tu macie prawdziwe smrody
- 2025-01-06 Białystok => Full Stack .Net Engineer <=
- 2025-01-06 Kraków => Business Development Manager - Network and Network Security
- 2025-01-06 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2025-01-06 Warszawa => Spedytor Międzynarodowy <=
- 2025-01-06 Lublin => Programista Delphi <=
- 2025-01-06 Gdańsk => Specjalista ds. Sprzedaży <=
- 2025-01-06 śnieg
- 2025-01-05 Żarówka do lampy z czujnikiem ruchu
- 2025-01-05 Rozkręcają się
- 2025-01-04 pozew za naprawę sprzętu na youtube
- 2025-01-04 gasik
- 2025-01-04 13. Raport Totaliztyczny: Powszechna Deklaracja Praw Człowieka Nie Chroni Przed Wyzyskiem Ani Przed Eksploatacją