To co? Bawimy się? :D

Zaczęty przez mariotti, 24 Maj 2013, 17:01

AXm77

#160

threadMemPerft6 10 16 580000000 8 1000000 - nodes:69352859712417 time:4593
threadMemPerft6 10  8 580000000 8 1000000 - nodes:69352859712417 time:9095
threadMemPerft6 10  4 580000000 8 1000000 - nodes:69352859712417 time:18154

Rysiu

Panowie nie chcę nikogo trochę hamować ale niestety większości ze spraw o których tutaj jest pisane odnośnie obliczeń rozproszonych nie ma najmniejszych szans realizacji.

Droga od postawienia serwera BOINC do czegoś takiego o czym piszecie jest bardzo długa i zawiła. Jak czytałem mówimy tutaj o serwerze master, który dosyła dane do klientów i o jakimś skalowaniu wątków, wewnętrznych benchmarkach oraz aplikacjach działających na różnej ilości wątków. Niestety 99% z tego trzeba wsadzić do kosza. Nawet najlepsze projekty różnie działają, a różnica między pierwszym projektem, który sobie na szybkiego odpalimy a czołówką najlepszych jest gigantyczna.

Do czegoś takiego najprawdopodobniej łatwiej byłoby napisać własny soft w postaci klienta i serwera i udostępnić liczącym. Wtedy mamy całkowitą dowolność i pisząc całość od zera w technologii, którą znamy możemy coś takiego zrobić.

Tak napisać, że serwer ma robić X, a klient to będzie sobie pobierać Y i skalować odpowiednio tylko wątki to prosto. Problem jednak zamknie się na tym, że podczas konfiguracji wyskoczy jeden błąd i będzie kaplica. Alarmuję więc - nie twórzmy wielkich teorii o tym jak ma działać serwer BOINC, a dostosujmy się do tego jak jest on skonstruowany.

Koncepcja podstawowej aplikacji BOINC jest szalenie prosta.

1. Serwer tworzy zadanie
2. Klient pobiera aplikację liczącą i zadanie
3. Klient wykonuje obliczenia sekwencyjnie na jednym wątku i zapisuje wyniki do pliku
4. Klient odsyła dane (także plik wyniku) do serwera
5. Serwer analizuje nadesłane dane

Nie ma tutaj miejsca na jakąkolwiek komunikację w środku wykonywania zadania. Jedyna znacząca komunikacja to pobieranie zadania i odsyłanie wyników. Zadania także nie mogą być liczone w dziesiątkach czy też setkach na jednym kliencie w jakimś krótkim odcinku czasowym. Żaden serwer BOINC tego nie obsłuży. Każde zadanie powinno wykonywać się przynajmniej godzinę.

Znak zapytania bym postawił przy samych aplikacjach wielowątkowych, pomimo, że takie BOINC wspiera.

Przepraszam za takie oblanie zimną wodą ale niestety tak to wygląda. Oczywiście można zrobić wszystko - pytanie tylko czy ktoś zdoła obejść wszystkie problemy. Wydaje mi się, że nie jest to tego kalibru problem aby pisać pod niego na nowo pół środowiska serwera BOINC.

Szopler

Jest jeszcze taki myk, że serwer może nam podesłać duże zadanie i klient może odsyłać wyniki cząstkowe za pomocą Trickle.

krzyszp

A także drugi myk - user może dla każdego hosta ustawiać ile rdzeni ma liczyć poprzez preferencje.

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

AXm77


threadMemPerft6 10 48 580000000 8 1000000 - nodes:69352859712417 time:1642
threadMemPerft6 10 48 580000000 5 1000000 - nodes:69352859712417 time:1617
threadMemPerft6 10 48 580000000 5 10000000 - nodes:69352859712417 time:1613


Jak widać powyżej zmiana przedostatniej zmiennej poprawiła minimalnie wynik. Jaka jest najmniejsza wartość tej zmiennej?

mariotti

#165
Cytat: AXm77 w 31 Maj 2013, 16:32

threadMemPerft6 10 48 580000000 8 1000000 - nodes:69352859712417 time:1642
threadMemPerft6 10 48 580000000 5 1000000 - nodes:69352859712417 time:1617
threadMemPerft6 10 48 580000000 5 10000000 - nodes:69352859712417 time:1613

Jak widać powyżej zmiana przedostatniej zmiennej poprawiła minimalnie wynik. Jaka jest najmniejsza wartość tej zmiennej?
Dziękuję za kolejne testy. Kolejna wersja algorytmu działa u mnie wyraźnie gorzej, więc nie
udostępniam dziś nowej. Będę musiał popracować teraz nad:
1) serwerem boinc
2) optymalizacją liniową
Obie rzeczy zajmą mi sporo czasu, więc następne wersje do testowania mogą pojawiać się w
dłuższych odstępach czasu.

---------------------------------------------------------------------------------------------------------
Znaczenie parametrów w komendzie:
threadMemPerft6 depth max_thread hsize hprobe forget
depth - oczywiście głębokość przeszukiwania
max_thread - maksymalna ilość wątków obciążających
hsize  - rozmiar hash-table w elementach, jeden element to 24 bajty

hprobe - ten parametr decyduje o tym jak długo program ma szukać po
pierwsze elementu najgorszego a po drugie elementu w którym został zapisany
dany układ. Układy często powtarzają się, więc po obliczeniach program
zapamiętuje wyniki w hash-table, a przed obliczeniami sprawdza czy nie ma w
niej gotowego wyniku. Parametr hprobe decyduje o tym ile elementów
program ma przeszukać w trakcie szukania wyników. Im więcej przeszuka, tym
bardziej go to spowolni, ale sprawa nie jest taka prosta. Niektóre pod-zadania są
bardziej czasochłonne, inne mniej. Jeśli parametr hprobe jest duży, to program
przeszuka więcej elementów także w takim celu, alby znaleźć element najgorszy.
Najgorszy czyli taki, z którego zapamiętania są (potencjalnie) najmniejsze korzyści.

W skrócie: mała wartość tego parametru powoduje że program szybko
wyszukuje, ale może usunąć ważny element. Duża wartość powoduje, że
program wyszukuje długo i go to spowalnia, ale usuwa mało przydatne
elementy.

Optymalna wartość tego parametru leży w granicach od 1 do 20, a bardziej
prawdopodobnie w przedziale od 3 do 12.

forget - ten parametr to bonus dla nowych układów. Układy warto przechowywać w
hash-table gdy po pierwsze dają duże oszczędności, a po drugie gdy są nowe. Wyjaśnienie
dlaczego warto przechowywać nowe układy które dają mniej oszczędności niż stare jest
dość zawiłe, więc je pominę. Im większą wartość nadamy temu parametrowi, tym bardziej
będą preferowane nowe układy. Optymalnej wartości nie znam, ani nawet nie potrafię
oszacować w jakim ona leży przedziale. Dozwolone wartości są od zera do ponad 4 miliardów.

Poniżej aktualna tabelka:

------------------------------------------------------------------------------------------------------------------
Wersja | Procesor               | polecenie                                 | wynik            | czas   | user
------------------------------------------------------------------------------------------------------------------
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 1000000   | 69352859710032!  | 63547s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 1 0         | 69352859712417ok | 41515s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 0         | 69352859712417ok | 30042s |
   1   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 200       | 69352859712417ok | 25889s |
   2[1]| Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 8 1000000  | 69352859712417ok | 24071s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 12 10000000 | 69352859712417ok | 18111s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 50000000  | 69352859712417ok | 17781s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 10000000  | 69352859712417ok | 17768s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 12 1000000 | 69352859712417ok | 15643s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 5  1000000 | 69352859712417ok | 15251s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 8  1000000 | 69352859712417ok | 15186s |
   3   | Phenom II 1050T 2.4GHz | threadMemPerft6 10 6 250000000 8  1000000 | 69352859712417ok | 13618s |
   3   | Phenom II 1050T 2.4GHz | threadMemPerft6 10 6 250000000 8 10000000 | 69352859712417ok | 13599s |

   0   | Q6600                  | threadMemPerft 10 5 50000000 8 1000000    | 69352859712417ok | 42144s | krzyszp
   2   | Q6600                  | threadMemPerft5 10 4 50000000 8 10000000  | 69352859712417ok | 37149s | krzyszp

   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 0         | 69352859712417ok | 21051s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 200       | 69352859712417ok | 16967s |
   0   | i7 950 @3.07GHz        | threadMemPerft2 10 5 56250000 8 1         | 69352859712417ok | 13667s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 1000000   | 69352859712417ok | 12173s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 4 450000000 8 10000000 | 69352859712417ok | 12144s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 10000000  | 69352859712417ok | 12092s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 5 450000000 8 10000000 | 69352859712417ok | 11475s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 5 450000000 5 10000000 | 69352859712417ok | 11396s |
   3   | i7 950 @3.07GHz        | threadMemPerft6 10 5 450000000 8 30000000 | 69352859712417ok | 10359s |
   3   | i7 950 @3.07GHz        | threadMemPerft6 10 5 450000000 8 10000000 | 69352859712417ok | 10341s |

   0   | e3-1230 v2 3.3ghz      | threadMemPerft 10 6 259200000 8 200       | 69352859712417ok | 16895s | sknd
   2[2]| e3-1230 v2 3.3ghz      | threadMemPerft 10 6 259200000 5 10000000  | 69352859712417ok | 13683s | sknd
   0   | e3-1230 v2 3.3ghz      | threadMemPerft2 10 6 32400000 8 1         | 69352859712417ok | 13085s | sknd
   2   | e3-1230 v2 3.3ghz      | threadMemPerft5 10 4 259200000 8 10000000 | 69352859712417ok | 12730s | sknd
   0   | e3-1230 v2 3.3ghz      | threadMemPerft2 10 6 32400000 8 7         | 69352859712417ok | 11709s | sknd

   2   | Q9400                  | threadMemPerft2 10 4 6250000 8 6          | 69352859712417ok | 34954s | patyczak
   2   | Q9400                  | threadMemPerft5 10 4 50000000 8 10000000  | 69352859712417ok | 32666s | patyczak

   2   | AMD 48core             | threadMemPerft5 10  4 580000000 8 1000000 | 69352859712417ok | 19820s | AXm77
   2   | AMD 48core             | threadMemPerft6 10  4 580000000 8 1000000 | 69352859712417ok | 18154s | AXm77
   2   | AMD 48core             | threadMemPerft5 10  8 580000000 8 1000000 | 69352859712417ok | 10352s | AXm77
   2   | AMD 48core             | threadMemPerft6 10  8 580000000 8 1000000 | 69352859712417ok |  9095s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 16 580000000 8 1000000 | 69352859712417ok |  5362s | AXm77
   2   | AMD 48core             | hreadMemPerft6 10 16 580000000 8 1000000  | 69352859712417ok |  4593s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 24 580000000 8 1000000 | 69352859712417ok |  3709s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 24 580000000 8 1000000 | 69352859712417ok |  3080s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 1 10000000| 69352859712417ok |  2921s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 32 580000000 8 1000000 | 69352859712417ok |  2883s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 32 580000000 8 1000000 | 69352859712417ok |  2383s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 52 580000000 8 1000000 | 69352859712417ok |  2074s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 3 10000000| 69352859712417ok |  1669s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 48 580000000 8 1000000 | 69352859712417ok |  2065s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 52 580000000 8 1000000 | 69352859712417ok |  1658s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 8 1000000 | 69352859712417ok |  1642s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 4 10000000| 69352859712417ok |  1641s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1000000 | 69352859712417ok |  1617s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 10000000| 69352859712417ok |  1613s | AXm77
------------------------------------------------------------------------------------------------------------------
[1] - z tej wersji prawdopodobnie zapomniałem usunąć asercje i spowolniły program.
[2] - dwa rdzenie komputera były obciążone


sknd

jeszcze powiedz, co ci teraz ewentualnie potestować  :)

Dario666

Właśnie o tym mówiłem. Najprostrze rozwiązania są najlepsze  ;D , a nie kombinować jak koń pod górę z dzieleniem zadań na duże ilości wątków. Jak widać z wyników ten Opteron na jednym wątku przeliczy na głębokość 10 w około 20 godzin. To jest bardzo dobry czas na uzyskanie 1 rozwiązania, które ładnie można odesłać na serwer. Wtedy serwer projektu uzupełnia sobie bazę danych i zapodaje nowe zadania. Jeśli ktoś będzie chciał i będzie miał tyle rdzeni to może i 48 takich zadań na raz liczyć. Na razie chyba nie wiesz jaka jest rzeczywista róznica między rozwiązaniem wielowątkowym, a uruchomieniem wielu procesó 1 wątkowych...

sknd

tylko ze jak 20 godzin WU to koniecznie checkpointy...

AXm77


threadMemPerft6 10 48 580000000 1 10000000 - nodes:69352859712417 time:2921


Jak widać hprobe=1 prawie podwoił czas liczenia  :(

Spróbuję 3 i 4.

mariotti

Cytat: Rysiu w 31 Maj 2013, 13:08
Panowie nie chcę nikogo trochę hamować ale niestety większości ze spraw o których tutaj jest pisane odnośnie obliczeń rozproszonych nie ma najmniejszych szans realizacji.
Prawdopodobnie niezbyt jasno się wyraziłem, raczej chcę zrobić prostą rzecz, co najwyżej dobrze stuningowaną, bo
przyspieszenie obliczeń jest bardzo ważne.

Cytat: Rysiu w 31 Maj 2013, 13:08
Droga od postawienia serwera BOINC do czegoś takiego o czym piszecie jest bardzo długa i zawiła.
Mogę się mylić, ale przypuszczam że to jest kwestia dobrego kursu i potem małego treningu w celu
nabrania wprawy. Na razie moim problemem jest brak jasnych i zrozumiałych tutoriali. Coś czytam,
jakoś rozumiem, próbuję, nie działa, nie wiem dlaczego nie działa, potem dumam tydzień aż
się zniechęcam. Wszystko zależy jakie gotowce udostępnia BOINC przez swoje API. Jeśli te
gotowce są przyzwoite, to po dobrym kursie przerobię sprawnie każdą aplikację liczącą na
serwer boinc.


Cytat: Rysiu w 31 Maj 2013, 13:08
Jak czytałem mówimy tutaj o serwerze master, który dosyła dane do klientów i o jakimś skalowaniu wątków, wewnętrznych benchmarkach oraz aplikacjach działających na różnej ilości wątków. Niestety 99% z tego trzeba wsadzić do kosza. Nawet najlepsze projekty różnie działają, a różnica między pierwszym projektem, który sobie na szybkiego odpalimy a czołówką najlepszych jest gigantyczna.
Mnie się akurat to wydaje łatwe, pracochłonne, ale łatwe.

Cytat: Rysiu w 31 Maj 2013, 13:08
Do czegoś takiego najprawdopodobniej łatwiej byłoby napisać własny soft w postaci klienta i serwera i udostępnić liczącym. Wtedy mamy całkowitą dowolność i pisząc całość od zera w technologii, którą znamy możemy coś takiego zrobić.
To powinno być łatwiejsze w boinc, bo daje gotowe API. Problem właśnie w tym, że trzeba się nauczyć i konfiguracji i API.

Cytat: Rysiu w 31 Maj 2013, 13:08
Tak napisać, że serwer ma robić X, a klient to będzie sobie pobierać Y i skalować odpowiednio tylko wątki to prosto. Problem jednak zamknie się na tym, że podczas konfiguracji wyskoczy jeden błąd i będzie kaplica. Alarmuję więc - nie twórzmy wielkich teorii o tym jak ma działać serwer BOINC, a dostosujmy się do tego jak jest on skonstruowany.
Można dać zupełnie osobną aplikację gdzieś na stronie www. Aplikacja uruchomi się, przetestuje dany komputer i wyświetli
użytkownikowi jakie parametry należy wpisać w konfiguracji. Nie wydaje się to zbytnio trudne.


Cytat: Rysiu w 31 Maj 2013, 13:08
Koncepcja podstawowej aplikacji BOINC jest szalenie prosta.
1. Serwer tworzy zadanie
2. Klient pobiera aplikację liczącą i zadanie
3. Klient wykonuje obliczenia sekwencyjnie na jednym wątku i zapisuje wyniki do pliku
4. Klient odsyła dane (także plik wyniku) do serwera
5. Serwer analizuje nadesłane dane
Schemat wydaje się prosty. Tak myślę sobie... mogę przygotować zestaw plików-zadań.
Serwer będzie musiał rozdać klientom te pliki-zadania. Klient do każdego pliku-zadania da
plik-odpowiedź. To jest proste, bo serwer nawet nie musiałby robić żadnej analizy. Tylko
pod pliki-zadania i zbierze pliki-odpowiedzi. Wyniki potem można przeanalizować w
aplikacji poza serwerem. Gdzie będą błędy, tam się wrzuci taski ponownie do weryfikacji.

Ale... gdzie miejsce na użytkowników? Gdzie hasła i autoryzacja? Gdzie statystyki użytkowników?
Czyżby to BOINC dawał sam bez żadnych konfiguracji?


Cytat: Rysiu w 31 Maj 2013, 13:08
Nie ma tutaj miejsca na jakąkolwiek komunikację w środku wykonywania zadania. Jedyna znacząca komunikacja to pobieranie zadania i odsyłanie wyników.
Rozumiem. Czyli bardziej zaawansowana komunikacja musiałaby się odbywać przez
podanie specyficznego zadania, np. zadanie zrób benchmark, albo zadanie: ustaw parametry.


Cytat: Rysiu w 31 Maj 2013, 13:08
Zadania także nie mogą być liczone w dziesiątkach czy też setkach na jednym kliencie w jakimś
krótkim odcinku czasowym. Żaden serwer BOINC tego nie obsłuży. Każde zadanie powinno wykonywać
się przynajmniej godzinę.
Tutaj optymalny czas będzie zależał od tego jak zoptymalizuję aplikację. Teraz optymalny task
trwałby na przeciętnym kompie jakieś 30-60tys sekund. Po optymalizacji może trwać 3-6tys
sekund. Jeśli optymalny task będzie zbyt długi albo krótki, to podamy taski nieoptymalne.
Wydłuży to cały proces liczenia, ale nie ma innego wyjścia.


Cytat: Rysiu w 31 Maj 2013, 13:08
Znak zapytania bym postawił przy samych aplikacjach wielowątkowych, pomimo, że takie BOINC wspiera.
To już jest wykonane, a jeśli BOINC to wspiera, to tylko podepniemy. Domyślnie aplikacja wystartuje
w jednym wątku, a jak użytkownik zechce liczyć na kilku wątkach, to sobie zwiększy.


Cytat: Rysiu w 31 Maj 2013, 13:08
Przepraszam za takie oblanie zimną wodą ale niestety tak to wygląda. Oczywiście można zrobić wszystko - pytanie tylko czy ktoś zdoła obejść wszystkie problemy. Wydaje mi się, że nie jest to tego kalibru problem aby pisać pod niego na nowo pół środowiska serwera BOINC.
Nie oblałeś mnie zimną wodą, jestem świadomy tego że pojawią się problemy. Czy warto? Uczymy się, a prosty projekt
może jest lepszy do nauki niż skomplikowany. Jeśli dzięki temu nauczę się stawiać takie aplikacje, to potem będę mógł
Wam coś zrobić i nie tylko. Jestem pewny że warto, natomiast nie wiem czy przebrnę przez te wszystkie materiały które
są dla mnie jak na razie strasznie zawiłe i niejasne.

Pozdrawiam i dzięki Rysiu za wszelkie wyjaśnienia :)

mariotti

Cytat: sknd w 31 Maj 2013, 17:31
jeszcze powiedz, co ci teraz ewentualnie potestować  :)

Nie ma nowej wersji wartej przetestowania. W starej wersji warto poszukać dobrych
wartości dwóch ostatnich parametrów, czym właśnie zajmuje się AXm77. Na jutro
przygotuję nową wersję, a jeśli będzie tego warta, to porównamy z poprzednią.

Pozdrawiam i dzięki.

mariotti

#172
Cytat: Dario666 w 31 Maj 2013, 17:33
Właśnie o tym mówiłem. Najprostrze rozwiązania są najlepsze  ;D , a nie kombinować jak koń pod górę z dzieleniem zadań na duże ilości wątków. Jak widać z wyników ten Opteron na jednym wątku przeliczy na głębokość 10 w około 20 godzin. To jest bardzo dobry czas na uzyskanie 1 rozwiązania,
Myślałem że dobry czas to 1 godzina.

Cytat: Dario666 w 31 Maj 2013, 17:33
które ładnie można odesłać na serwer. Wtedy serwer projektu uzupełnia sobie bazę danych i zapodaje nowe zadania. Jeśli ktoś będzie chciał i będzie miał tyle rdzeni to może i 48 takich zadań na raz liczyć. Na razie chyba nie wiesz jaka jest rzeczywista róznica między rozwiązaniem wielowątkowym, a uruchomieniem wielu procesó 1 wątkowych...
Wiem że 20 aplikacji jednowątkowych policzy to samo zadanie znacznie wolniej niż 1 aplikacja 20 wątkowa. A jeśli te 20 aplikacji
jedno wątkowych uruchomi się na raz, to policzą to samo zadanie koszmarnie wolniej. Natomiast masz rację że nie wiem co
znaczy "znacznie" i "koszmarnie" :) Znacznie może oznaczać 1.5-3.0 raza, koszmarnie być może 5-30 razy.

Ale spokojnie, jak już pisałem, ta sama aplikacja może z powodzeniem działać jako jednowątkowa, podaje się tylko parametr i działa.

Pozdrawiam

P.S.
Panowie, to jest specyficzna aplikacja. To nie jest tak, że jak aplikacja weźmie sobie 1 zadanie, to policzy je 10 razy
szybciej niż 10 zadań. Ta aplikacja skaluje się w specyficzny i trudny do oszacowania sposób. Ale myślę że nie będzie z
tym żadnego problemu. Do pliku tekstowego wsadzi się 5-20 zadań i użytkownik nawet się nie dowie, że jedno zadanie
to kilka zadań.

Nie ma dziś czego testować, więc zróbmy eksperyment. Eksperyment w przybliżeniu pokaże
czy się opłaca pakować do paczki 20 zadań. Poniższy skrypt najpierw liczy 20 razy niezależnie
na głębokość 9 ruchów. Potem liczy raz na głębokość 10 ruchów - to na razie jedyny sposób
na zasymulowanie pliku tekstowego z 20ma zadaniami. Można wpisać inne wartości parametrów,
np depth=8 przyspieszy eksperyment.


#!/bin/sh
#threadMemPerft6 depth max_thread hsize hprobe forget
depth=9
max_thread=4
hsize=10000000
hprobe=8
forget=1000000

bench1=`date +"+%s"`
echo "start" > out.txt

(
echo "setBoard rnbqkbnr/pppppppp/8/8/8/7N/PPPPPPPP/RNBQKB1R b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/2N5/PPPPPPPP/R1BQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/N7/PPPPPPPP/R1BQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/7P/8/PPPPPPP1/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/7P/PPPPPPP1/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/6P1/8/PPPPPP1P/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/6P1/PPPPPP1P/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/5P2/8/PPPPP1PP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/5P2/PPPPP1PP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/4P3/PPPP1PPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/2P5/8/PP1PPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/2P5/PP1PPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/1P6/8/P1PPPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/1P6/P1PPPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/P7/8/1PPPPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "setBoard rnbqkbnr/pppppppp/8/8/8/P7/1PPPPPPP/RNBQKBNR b qkQK -; repeat: 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "quit"
) | ./perft3 >> out.txt


bench2=`date +"+%s"`
echo "bench=$((bench2-bench1))" >> out.txt






bench1=`date +"+%s"`
echo start >> out.txt


depth=$((depth+1))

(
echo "setBoard rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
echo "threadMemPerft6 $depth $max_thread $hsize $hprobe $forget"
echo "quit"
) | ./perft3 >> out.txt


bench2=`date +"+%s"`
echo "bench=$((bench2-bench1))" >> out.txt




AXm77


threadMemPerft6 10 48 580000000 4 10000000 - nodes:69352859712417 time:1641
threadMemPerft6 10 48 580000000 3 10000000 - nodes:69352859712417 time:1669


4 "wygląda" podobnie do 8, a 3=4   - pomyłka

Jeszcze jedno pytanie: czy hprobe jest zależny od forget i odwrotnie?

mariotti

Cytat: AXm77 w 31 Maj 2013, 18:49

threadMemPerft6 10 48 580000000 4 10000000 - nodes:69352859712417 time:1641
threadMemPerft6 10 48 580000000 3 10000000 - nodes:69352859712417 time:1669

4 "wygląda" podobnie do 8, a 3=4   - pomyłka
Jeszcze jedno pytanie: czy hprobe jest zależny od forget i odwrotnie?
Niestety hprobe i forget są zależne, a właściwie to wszystkie parametry są od
siebie zależne. Można poszukać najlepszej wartości hprobe dla forget równego
np. 0, 1000, 100000, 1000000, 5000000, 10000000 i 100000000. Parametry
te nie dają dużego przyspieszenia, więc bardziej szczegółowo nie trzeba
sprawdzać - a przynajmniej tak mi się wydaje.

Dzięki za testy i pozdrawiam :)

mariotti

#175
Cytat: Dario666 w 31 Maj 2013, 17:33
Jeśli ktoś będzie chciał i będzie miał tyle rdzeni to może i 48 takich zadań na raz liczyć. Na razie chyba nie wiesz
jaka jest rzeczywista róznica między rozwiązaniem wielowątkowym, a uruchomieniem wielu procesó 1 wątkowych...

Chyba moje przypuszczenia się potwierdzają. Odpaliłem tamten skrypt z kilku
postów wyżej dla depth=7 ( czyli 8 ) wyżej i są takie wyniki:

start
nodes:3221278282 time:9
nodes:3937354096 time:11
nodes:3926684340 time:12
nodes:3193522577 time:12
nodes:3711123115 time:11
nodes:2860408680 time:11
nodes:3466204702 time:9
nodes:3641432923 time:11
nodes:3199039406 time:10
nodes:2728615868 time:8
nodes:8102108221 time:20
nodes:8039390919 time:19
nodes:7184581950 time:18
nodes:6093248619 time:12
nodes:4199667616 time:12
nodes:3806229124 time:12
nodes:3569067629 time:11
nodes:3579299617 time:11
nodes:3676309619 time:11
nodes:2863411653 time:10
bench=240
start
nodes:84998978956 time:61
bench=61


Czyli 20 zadań na raz liczy 61 sekund, a osobno 240 - cztery razy wolniej. Zobaczymy
jak będzie dla większych głębokości - może dla małych głębokości taka różnica wynika z
dużego narzutu na rozruch.
-----------------------------------------------------------------------------------------------


Na głębokości 8 ( czyli 9 ) przyspieszenie jest 3 krotne dzięki technice pakowania wielu
zadań do jednego pliku:

start
nodes:86659653631 time:63
nodes:108393009416 time:106
nodes:109418317145 time:101
nodes:85849641909 time:84
nodes:102853440161 time:90
nodes:74778417365 time:70
nodes:92281289941 time:82
nodes:99646370024 time:99
nodes:84792070664 time:75
nodes:68094899093 time:62
nodes:263561543780 time:190
nodes:259522947791 time:149
nodes:227220482342 time:176
nodes:176976245463 time:150
nodes:120549219832 time:93
nodes:108697368719 time:92
nodes:97442160946 time:82
nodes:96577095997 time:88
nodes:101265301849 time:72
nodes:74950758099 time:76
bench=2000
start
nodes:2439530234167 time:658
bench=658



-------------------------------------------------------------------------------
Dla głębokości 9/10 wyszło ponad dwa razy szybciej


start
nodes:2470483499345 time:695
nodes:3090773583680 time:937
nodes:3096505857746 time:1135
nodes:2440848135252 time:893
nodes:2948003834105 time:924
nodes:2142832044687 time:857
nodes:2624128147144 time:985
nodes:2853630724145 time:1019
nodes:2418056589775 time:801
nodes:1945020011164 time:684
nodes:7380003266234 time:2464
nodes:7299373354878 time:2435
nodes:6459463242656 time:2274
nodes:5071006040569 time:1399
nodes:3437747391692 time:1072
nodes:3072577495123 time:1012
nodes:2772533545113 time:866
nodes:2774842822463 time:939
nodes:2905552970419 time:1015
nodes:2149477156227 time:780
bench=23186
start
nodes:69352859712417 time:10293
bench=10293



Nie jest to reprezentatywny eksperyment, ale na pewno serię zadań (w tym problemie) można policzyć
szybciej niż pojedynczo. Nawet jak przyspieszenie w ostatecznej wersji będzie tylko 10% to i tak warto.

Pozdrawiam

AXm77

#176
Kolejny wynik:


threadMemPerft6 10 48 580000000 5 1 - nodes:69352859712417 time:2854


Tak dla porównania:

threadMemPerft6 10 48 580000000 5 1                - nodes:69352859712417 time:2854
threadMemPerft6 10 48 580000000 5 1000           - nodes:69352859712417 time:1631
threadMemPerft6 10 48 580000000 5 1000000      - nodes:69352859712417 time:1617
threadMemPerft6 10 48 580000000 5 10000000    - nodes:69352859712417 time:1613
threadMemPerft6 10 48 580000000 5 1000000000 - nodes:69352859712417 time:1615

Także oprócz 1 to nie ma drastycznych różnic (0 nie chciało odpalić  |-?)

Dario666

Cytat: mariotti w 31 Maj 2013, 18:20
Eksperyment w przybliżeniu pokaże
czy się opłaca pakować do paczki 20 zadań. Poniższy skrypt najpierw liczy 20 razy niezależnie
na głębokość 9 ruchów. Potem liczy raz na głębokość 10 ruchów - to na razie jedyny sposób
na zasymulowanie pliku tekstowego z 20ma zadaniami. Można wpisać inne wartości parametrów,
np depth=8 przyspieszy eksperyment.

Wydaje mi się, że ta metoda nie jest zbyt reprezentacyjna. Wg mnie powinno się uruchomić na raz np. 20 procesów na głębokość X, i porównać to z czasem działania 1 procesu 20 wątkowego. Ważne jest, by procesy 1-wątkowe pracowały jednocześnie, bo wtedy muszą podzielić się ilością RAMu itp.

sknd

depth=8, procek e3-1230v2 w pelni obciążony boincem ;)

start
nodes:86659653631 time:117
nodes:108393009416 time:159
nodes:109418317145 time:163
nodes:85849641909 time:131
nodes:102853440161 time:137
nodes:74778417365 time:116
nodes:92281289941 time:138
nodes:99646370024 time:147
nodes:84792070664 time:124
nodes:68094899093 time:88
nodes:263561543780 time:395
nodes:259522947791 time:375
nodes:227220482342 time:304
nodes:176976245463 time:255
nodes:120549219832 time:148
nodes:108697368719 time:156
nodes:97442160946 time:126
nodes:96577095997 time:142
nodes:101265301849 time:132
nodes:74950758099 time:115
bench=3468
start
nodes:2439530234167 time:2378
bench=2378

krzyszp

Wyniki dla:
#!/bin/sh
(
echo threadMemPerft5 10 4 50000000 8 10000000
echo quit
) | ./perft2 >> out.txt
(
echo threadMemPerft2 10 4 6250000 8 6
echo quit
) | ./perft2 >> out.txt
echo done


nodes:69352859712417 time:37182
nodes:69352859712417 time:40806


chyba się pogubiłem... Gdzie jest plik perft3?

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: Dario666 w 31 Maj 2013, 22:24
Wydaje mi się, że ta metoda nie jest zbyt reprezentacyjna. Wg mnie powinno się uruchomić na raz np. 20 procesów na głębokość X, i porównać to z czasem działania 1 procesu 20 wątkowego. Ważne jest, by procesy 1-wątkowe pracowały jednocześnie, bo wtedy muszą podzielić się ilością RAMu itp.
Nie jest reprezentatywna, ale z innych powodów. Tak przeprowadzony eksperyment jak proponujesz,
jeszcze dobitniej wykaże, że opłaca się pakować wiele zadań do jednego pliku.
Pozdrawiam

AXm77

Cytat: krzyszp w 31 Maj 2013, 22:34
chyba się pogubiłem... Gdzie jest plik perft3?

Post #140

TJM

Materiały o stawianiu serwera są dość dobre, po angielsku - trzeba przekopywać BOINCową wikipedię. Niestety z doświadczenia wiem, że dla kogoś kto nie ma jeszcze wiedzy na temat działania serwera, to ciężki temat.

Taki telegraficzny skrót, co potrzeba na start:
Pierwsza rzecz której potrzebujesz, to działająca aplikacja. Albo z wbudowanym BOINC API, albo z użyciem wrappera (każde rozwiązanie ma zady i walety, ale czasami wrapper jest nawet leszy).
Aplikacja może mieć pliki wejściowe stałe i zmienne. Te stałe można wysyłać razem z aplikacją (ich ewentualny upgrade wykonuje się wtedy zmieniając wersję aplikacji i dorzucając nowe pliki). Pliki wejściowe zmienne mogą być przypisane do konkretnego zadania lub grupy zadań.
Aplikacja składająca się z wielu aplikacji odpalanych jedna po drugiej o wiele łatwiejsza jest do odpalenia z wrapperem, ale nie liczyłbym tu na żadne zaawansowane opcje oskryptowania, bo może się nie udać. Jest możliwość np. uruchomienia 10 razy pod rząd tego samego z różnymi plikami, albo kolejny przebieg z plikami wejściowymi z poprzedniego przebiegu [o ile ich nazwy są z góry ustalone].


Aplikacja do działania po stronie klienta potrzebuje templatek. Są dwie, wejściowa i wyjściowa. Pierwsza opisuje stan przed uruchomieniem aplikacji, pozwala na takie bajery, jak przypisanie plikom wirtualnych nazw [bardzo przydatne], określa które pliki są stałe, a które przyjdą z zadaniem oraz określa trochę parametrów dla zadania.
Druga działa odwrotnie - służy do zebrania plików wyjściowych, określa które zostaną odesłane do serwera i pod jakimi nazwami.  Słowa kluczowe do znalezienia info o tym na wiki BOINCa to input / output templates.
Do dodawania wpisów aplikacji na serwerze służą narzędzia update_versions i xadd, warto rzucić okiem na ich opis na wiki dla samego zrozumienia, jak zbudowane są katalogi aplikacji na serwerze.

Kolejna rzecz potrzebna do działania, to jakiś skrypt do generowania zadań. Zapomnij o tym, że dasz radę robić je ręcznie, może pierwsze kilkanaście ale potem idzie osiwieć.
Są dwie opcje - albo wykorzystuje się create_work i jego parametry linii poleceń (sam korzystam, łatwo go oskryptować, rad@h ma autopilota z wykorzystaniem create_work), albo opcja trudniejsza - napisanie własnego generatora na podstawie przykładu.
Pierwsza, łatwiejsza wersja sprowadza się do napisania skryptu basha który przekaże do create_work odpowiednie parametry (głównie chodzi np. o plik wejściowy, jeśli się zmienia [lub opcja jeszcze trudniejsza - jeśli dla każdego WU jest inny]). Dużo można wywnioskować z wiki czytając opis create_work lub wręcz help jego linii poleceń.

Na takim etapie teoretycznie projekt jest gotowy do wysłania zadań do klientów.
Niestety zadania wrócą i nie będzie z nich jako takiego pożytku, ponieważ potrzebny jest jeszcze validator.
Jeśli zadanie da się zweryfikować z grubsza analizując wynik, polecam przerobienie sample_trivial_validator - jest to pusta templatka z funkcjami które należy uzupełnić.
Jeśli weryfikacja jest bardziej złożona lub np. na podstawie jednego wyniku (z jednego zadania) nie można wyciągnąć bezpośredniego wniosku o poprawności (bo np. potrzeba skończyć cały batch czy coś), najlepiej - zwłaszcza na początku - użyć sample_bitwise_validatora i ustawić quorum na 2 - wtedy validator z automatu porówna dwa wyniki z różnych hostów i to zadecyduje czy zadania zostaną zaliczone jako poprawne. Tutaj czai się pułapka, ponieważ domyślnie oba pliki (z obu hostów) muszą być po prostu identyczne co do bajta.
Zadania z błędami będą wysyłane jeszcze raz, do innych hostów, odbywa się to automatycznie.

Następna rzecz konieczna do zadziałania to assimilator - należy ciutkę go poprawić - praktycznie wystarczy wyedytować w przykładowym ze 2 linijki - żeby 'wyciągał' potrzebne pliki z katalogów tymczasowych i kopiował je do jakiegoś innego katalogu (czy rozkładał po katalogach, wedle uznania administratora).

Mając tyle, można (o ile o czymś nie zapomniałem) uruchomić projekt. Dużo rzeczy na początek może działać z domyślnymi ustawieniami i będzie ok, po prostu konieczności zmian wyjdą w praniu.

P.S. Jeśli chciałbyś pogadać o jakichś szczegółach, zapraszam wieczorami na IRC.


W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

krzyszp

Cytat: AXm77 w 31 Maj 2013, 22:59
Cytat: krzyszp w 31 Maj 2013, 22:34
chyba się pogubiłem... Gdzie jest plik perft3?

Post #140
Dzięki, obliczenia już idą :)

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: TJM w 31 Maj 2013, 23:08
Materiały o stawianiu serwera są dość dobre, po angielsku - trzeba przekopywać BOINCową wikipedię. Niestety z doświadczenia wiem, że dla kogoś kto nie ma jeszcze wiedzy na temat działania serwera, to ciężki temat.
Już raz się przekonałem że ciężki, teraz drugie podejście.

Cytat: TJM w 31 Maj 2013, 23:08
Taki telegraficzny skrót, co potrzeba na start:
Pierwsza rzecz której potrzebujesz, to działająca aplikacja.
Aplikacja niby już jest, trzeba ją jeszcze "tylko" zoptymalizować i dokładniej przetestować.

Cytat: TJM w 31 Maj 2013, 23:08
Albo z wbudowanym BOINC API, albo z użyciem wrappera (każde rozwiązanie ma zady i walety, ale czasami wrapper jest nawet leszy).
Więc jest goły BOINC i jakiś/jakieś wrapper - dobrze wiedzieć na początek.

Cytat: TJM w 31 Maj 2013, 23:08
Aplikacja może mieć pliki wejściowe stałe i zmienne. Te stałe można wysyłać razem z aplikacją (ich ewentualny upgrade wykonuje się wtedy zmieniając wersję aplikacji i dorzucając nowe pliki). Pliki wejściowe zmienne mogą być przypisane do konkretnego zadania lub grupy zadań.
Brzmi zrozumiale, a w przypadku tego projektu zadania zdefiniowane w plikach będą wygodnym rozwiązaniem. Serwer
nie będzie musiał analizować poprzednich wyników, aby przygotować następne. Całą pulę zadań można przygotować raz odgórnie,
za wyjątkiem sprzecznych wyników. Tam gdzie wynik będą sprzeczne, zadania będzie trzeba zwielokrotnić i dodać je ponownie.
Pliki zajmą dużo miejsca, ale chyba zmieszczą się na jednym dysku.


Cytat: TJM w 31 Maj 2013, 23:08
Aplikacja składająca się z wielu aplikacji odpalanych jedna po drugiej o wiele łatwiejsza jest do odpalenia z wrapperem,
W tym projekcie jedna aplikacja powinna załatwić całą sprawę. A na przyszłość: czy można odpalić jeden
plik shell/cmd, a on odpali po kolei wszystko co trzeba?

Cytat: TJM w 31 Maj 2013, 23:08
ale nie liczyłbym tu na żadne zaawansowane opcje oskryptowania, bo może się nie udać. Jest możliwość np. uruchomienia 10 razy pod rząd tego samego z różnymi plikami, albo kolejny przebieg z plikami wejściowymi z poprzedniego przebiegu [o ile ich nazwy są z góry ustalone].
10 razy pod rząd to też dobre i wygodne rozwiązanie, może brzmi sarkastycznie, ale piszę serio.


Cytat: TJM w 31 Maj 2013, 23:08
Aplikacja do działania po stronie klienta potrzebuje templatek. Są dwie, wejściowa i wyjściowa. Pierwsza opisuje stan przed uruchomieniem aplikacji, pozwala na takie bajery, jak przypisanie plikom wirtualnych nazw [bardzo przydatne], określa które pliki są stałe, a które przyjdą z zadaniem oraz określa trochę parametrów dla zadania.
Druga działa odwrotnie - służy do zebrania plików wyjściowych, określa które zostaną odesłane do serwera i pod jakimi nazwami.  Słowa kluczowe do znalezienia info o tym na wiki BOINCa to input / output templates.
Plik wejściowy będzie jeden. Wyjściowy też jeden. Aplikacja... nie wiem jaka będzie, mogę ją dostosować
na wiele różnych sposobów. Największa wygoda to plik shell lub cmd który uruchomi to co jest potrzebne.
Idealnie jakby plik shell dostał jako parametr nazwę pliku wejściowego i uruchomił to co trzeba.

Cytat: TJM w 31 Maj 2013, 23:08
Do dodawania wpisów aplikacji na serwerze służą narzędzia update_versions i xadd, warto rzucić okiem na ich opis na wiki dla samego zrozumienia, jak zbudowane są katalogi aplikacji na serwerze.
Ok, rzucę okiem.

Cytat: TJM w 31 Maj 2013, 23:08
Kolejna rzecz potrzebna do działania, to jakiś skrypt do generowania zadań. Zapomnij o tym, że dasz radę robić je ręcznie, może pierwsze kilkanaście ale potem idzie osiwieć.
Są dwie opcje - albo wykorzystuje się create_work i jego parametry linii poleceń (sam korzystam, łatwo go oskryptować, rad@h ma autopilota z wykorzystaniem create_work), albo opcja trudniejsza - napisanie własnego generatora na podstawie przykładu.
Aplikacja ma już w sobie gotowy taki generator zadań. Trzeba go tylko przekonwertować do
jakiegoś docelowego formatu.

Cytat: TJM w 31 Maj 2013, 23:08
Pierwsza, łatwiejsza wersja sprowadza się do napisania skryptu basha który przekaże do create_work odpowiednie parametry (głównie chodzi np. o plik wejściowy, jeśli się zmienia [lub opcja jeszcze trudniejsza - jeśli dla każdego WU jest inny]). Dużo można wywnioskować z wiki czytając opis create_work lub wręcz help jego linii poleceń.
Z tego na razie nie rozumiem za dużo, poczytam na wiki. Czy create_work to program po
stronie klienta?


Cytat: TJM w 31 Maj 2013, 23:08
Na takim etapie teoretycznie projekt jest gotowy do wysłania zadań do klientów.
Niestety zadania wrócą i nie będzie z nich jako takiego pożytku, ponieważ potrzebny jest jeszcze validator.
Jeśli zadanie da się zweryfikować z grubsza analizując wynik, polecam przerobienie sample_trivial_validator - jest to pusta templatka z funkcjami które należy uzupełnić.
Brzmi ciekawie i nie wydaje się zbytnio trudne.


Cytat: TJM w 31 Maj 2013, 23:08
Jeśli weryfikacja jest bardziej złożona lub np. na podstawie jednego wyniku (z jednego zadania) nie można wyciągnąć bezpośredniego wniosku o poprawności (bo np. potrzeba skończyć cały batch czy coś), najlepiej - zwłaszcza na początku - użyć sample_bitwise_validatora i ustawić quorum na 2 - wtedy validator z automatu porówna dwa wyniki z różnych hostów i to zadecyduje czy zadania zostaną zaliczone jako poprawne. Tutaj czai się pułapka, ponieważ domyślnie oba pliki (z obu hostów) muszą być po prostu identyczne co do bajta.
Zadania z błędami będą wysyłane jeszcze raz, do innych hostów, odbywa się to automatycznie.
Może uda się tak ustawić, żeby porównał tylko pierwsze 100 bajtów w plikach?
Alby żeby porównał tylko N pierwszych wierszy w pliku tekstowym?



Cytat: TJM w 31 Maj 2013, 23:08
Następna rzecz konieczna do zadziałania to assimilator - należy ciutkę go poprawić - praktycznie wystarczy wyedytować w przykładowym ze 2 linijki - żeby 'wyciągał' potrzebne pliki z katalogów tymczasowych i kopiował je do jakiegoś innego katalogu (czy rozkładał po katalogach, wedle uznania administratora).
Nie rozumiem. Czy chodzi o kopiowanie plików z wynikami? Czy o parowanie input-output?


Cytat: TJM w 31 Maj 2013, 23:08
Mając tyle, można (o ile o czymś nie zapomniałem) uruchomić projekt. Dużo rzeczy na początek może działać z domyślnymi ustawieniami i będzie ok, po prostu konieczności zmian wyjdą w praniu.
W sumie to całkiem podobnie sobie to wszystko wyobrażałem, pozostaje zagadką dla mnie, dlaczego
poprzednio sobie nie poradziłem - może nie mam smykałki do konfiguracji i administracji :)


Cytat: TJM w 31 Maj 2013, 23:08
P.S. Jeśli chciałbyś pogadać o jakichś szczegółach, zapraszam wieczorami na IRC.
Przyjrzę się wszystkiemu z bliska, spróbuję zrobić, a jak nie będzie szło, to
poproszę Cię o dalszą pomoc.


mariotti

Cytat: krzyszp
nodes:69352859712417 time:37182
nodes:69352859712417 time:40806
Czyli dwójka została z tyłu. Dwójka od piątki różni się drobiazgiem, a prawie godzina
różnicy w czasie wykonania. Piątka od szóstki różni się zasadniczo, ale 2 i 5 są bardzo podobne. Może w
dwójce trudniej jest znaleźć optymalne parametry. Gdy już ruszy aplikacja jako projekt boinc, to zrobimy
lepsze testy. Spróbuję napisać hybrydę z dwójki i szóstki :) Dzięki za testy!




Cytat: AXm77
Tak dla porównania:
threadMemPerft6 10 48 580000000 5 1                - nodes:69352859712417 time:2854
threadMemPerft6 10 48 580000000 5 1000           - nodes:69352859712417 time:1631
threadMemPerft6 10 48 580000000 5 1000000      - nodes:69352859712417 time:1617
threadMemPerft6 10 48 580000000 5 10000000    - nodes:69352859712417 time:1613
threadMemPerft6 10 48 580000000 5 1000000000 - nodes:69352859712417 time:1615
Także oprócz 1 to nie ma drastycznych różnic (0 nie chciało odpalić  |-?)
Dzięki za testy, widać wszystko jak na dłoni.

Faktycznie różnice są znikome. Zero nie ma sensu w threadMemPerft2, w 6 ma
sens, ale z powodu mojego niedopatrzenia pozostała blokada na zero z wersji 2 - przepraszam
za zamieszanie.

Myślę że jak na początkowy etap aplikacja została porządnie przetestowana, a w dodatku
wiemy który algorytm jest najlepszy i wiemy, że sprawdza się on tak samo dobrze na
różnych konfiguracjach sprzętowych. Dziękuję wszystkim za pomoc.  Teraz spróbuję
zrobić wersję testową opartą na BOINC, a także przyspieszę program liniowo. Zajmie
mi to trochę czasu, ale nie ma tego złego... przez ten czas może jeszcze wpadnie mi
jakiś pomysł na lepsze wykorzystanie pamięci RAM. O przyspieszeniu liniowym nie ma co
rozmawiać, to po prostu nudna i ciężka robota, tak więc wątek teraz pójdzie w
kierunku konfiguracji serwera BOINC :)

Zamieszczam najnowszą wersję tabelki:

------------------------------------------------------------------------------------------------------------------
Wersja | Procesor               | polecenie                                    | wynik            | czas   | user
------------------------------------------------------------------------------------------------------------------
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 1000000      | 69352859710032!  | 63547s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 1 0            | 69352859712417ok | 41515s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 0            | 69352859712417ok | 30042s |
   1   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 200          | 69352859712417ok | 25889s |
   2[1]| Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 8 1000000     | 69352859712417ok | 24071s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 12 10000000    | 69352859712417ok | 18111s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 50000000     | 69352859712417ok | 17781s |
   0   | Phenom II 1050T 2.4GHz | threadMemPerft 10 8 250000000 8 10000000     | 69352859712417ok | 17768s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 12 1000000    | 69352859712417ok | 15643s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 5  1000000    | 69352859712417ok | 15251s |
   2   | Phenom II 1050T 2.4GHz | threadMemPerft5 10 6 250000000 8  1000000    | 69352859712417ok | 15186s |
   3   | Phenom II 1050T 2.4GHz | threadMemPerft6 10 6 250000000 8  1000000    | 69352859712417ok | 13618s |
   3   | Phenom II 1050T 2.4GHz | threadMemPerft6 10 6 250000000 8 10000000    | 69352859712417ok | 13599s |

   0   | Q6600                  | threadMemPerft 10 5 50000000 8 1000000       | 69352859712417ok | 42144s | krzyszp
   2   | Q6600                  | threadMemPerft2 10 4 6250000 8 6             | 69352859712417ok | 40806s | krzyszp
   2   | Q6600                  | hreadMemPerft5 10 4 50000000 8 10000000      | 69352859712417ok | 37182s | krzyszp
   2   | Q6600                  | threadMemPerft5 10 4 50000000 8 10000000     | 69352859712417ok | 37149s | krzyszp

   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 0            | 69352859712417ok | 21051s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 200          | 69352859712417ok | 16967s |
   0   | i7 950 @3.07GHz        | threadMemPerft2 10 5 56250000 8 1            | 69352859712417ok | 13667s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 1000000      | 69352859712417ok | 12173s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 4 450000000 8 10000000    | 69352859712417ok | 12144s |
   0   | i7 950 @3.07GHz        | threadMemPerft 10 5 450000000 8 10000000     | 69352859712417ok | 12092s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 5 450000000 8 10000000    | 69352859712417ok | 11475s |
   2   | i7 950 @3.07GHz        | threadMemPerft5 10 5 450000000 5 10000000    | 69352859712417ok | 11396s |
   3   | i7 950 @3.07GHz        | threadMemPerft6 10 5 450000000 8 30000000    | 69352859712417ok | 10359s |
   3   | i7 950 @3.07GHz        | threadMemPerft6 10 5 450000000 8 10000000    | 69352859712417ok | 10341s |
   3   | i7 950 @3.07GHz        | threadMemPerft6 10 5 450000000 4 1000000     | 69352859712417ok | 10293s |

   0   | e3-1230 v2 3.3ghz      | threadMemPerft 10 6 259200000 8 200          | 69352859712417ok | 16895s | sknd
   2[2]| e3-1230 v2 3.3ghz      | threadMemPerft 10 6 259200000 5 10000000     | 69352859712417ok | 13683s | sknd
   0   | e3-1230 v2 3.3ghz      | threadMemPerft2 10 6 32400000 8 1            | 69352859712417ok | 13085s | sknd
   2   | e3-1230 v2 3.3ghz      | threadMemPerft5 10 4 259200000 8 10000000    | 69352859712417ok | 12730s | sknd
   0   | e3-1230 v2 3.3ghz      | threadMemPerft2 10 6 32400000 8 7            | 69352859712417ok | 11709s | sknd

   2   | Q9400                  | threadMemPerft2 10 4 6250000 8 6             | 69352859712417ok | 34954s | patyczak
   2   | Q9400                  | threadMemPerft5 10 4 50000000 8 10000000     | 69352859712417ok | 32666s | patyczak

   2   | AMD 48core             | threadMemPerft5 10  4 580000000 8 1000000    | 69352859712417ok | 19820s | AXm77
   3   | AMD 48core             | threadMemPerft6 10  4 580000000 8 1000000    | 69352859712417ok | 18154s | AXm77
   2   | AMD 48core             | threadMemPerft5 10  8 580000000 8 1000000    | 69352859712417ok | 10352s | AXm77
   3   | AMD 48core             | threadMemPerft6 10  8 580000000 8 1000000    | 69352859712417ok |  9095s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 16 580000000 8 1000000    | 69352859712417ok |  5362s | AXm77
   3   | AMD 48core             | hreadMemPerft6 10 16 580000000 8 1000000     | 69352859712417ok |  4593s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 24 580000000 8 1000000    | 69352859712417ok |  3709s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 24 580000000 8 1000000    | 69352859712417ok |  3080s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 48 580000000 1 10000000   | 69352859712417ok |  2921s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 32 580000000 8 1000000    | 69352859712417ok |  2883s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 32 580000000 8 1000000    | 69352859712417ok |  2383s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1          | 69352859712417ok |  2854s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 52 580000000 8 1000000    | 69352859712417ok |  2074s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 48 580000000 3 10000000   | 69352859712417ok |  1669s | AXm77
   2   | AMD 48core             | threadMemPerft5 10 48 580000000 8 1000000    | 69352859712417ok |  2065s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 52 580000000 8 1000000    | 69352859712417ok |  1658s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 48 580000000 8 1000000    | 69352859712417ok |  1642s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 48 580000000 4 10000000   | 69352859712417ok |  1641s | AXm77
   3   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1000000    | 69352859712417ok |  1617s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1000       | 69352859712417ok |  1631s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1000000    | 69352859712417ok |  1617s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 1000000000 | 69352859712417ok |  1615s | AXm77
   2   | AMD 48core             | threadMemPerft6 10 48 580000000 5 10000000   | 69352859712417ok |  1613s | AXm77
------------------------------------------------------------------------------------------------------------------
[1] - z tej wersji prawdopodobnie zapomniałem usunąć asercje i spowolniły program.
[2] - dwa rdzenie komputera były obciążone




Szopler

Na konfigurację serwera proponuję nowy wątek. Przyda się kiedyś komuś bez potrzeby szukania po wątkach "zabawowych" ;)

mariotti

Cytat: Szopler w 01 Czerwiec 2013, 10:45
Na konfigurację serwera proponuję nowy wątek. Przyda się kiedyś komuś bez potrzeby szukania po wątkach "zabawowych" ;)
Spróbujemy :)

mariotti

Cytat: mariotti w 02 Czerwiec 2013, 05:35
Cytat: Szopler w 01 Czerwiec 2013, 10:45
Na konfigurację serwera proponuję nowy wątek. Przyda się kiedyś komuś bez potrzeby szukania po wątkach "zabawowych" ;)
Spróbujemy :)
Spróbowałem i na razie nie wiem z tego nic. Masakra :/

AXm77


Troll81

gdzies na naszej wiki jest chyba tutorial jak postawic serwer BOINCa na debianie.....

mariotti

#191
Cytat: Troll81 w 03 Czerwiec 2013, 18:13
gdzies na naszej wiki jest chyba tutorial jak postawic serwer BOINCa na debianie.....
Dzięki za pomoc i linki, będę dalej próbował. Jak na razie rozumiem to co napisał TJM i
niestety nic więcej :/ No ale może w końcu załapię.
Pozdrawiam

mariotti

Cytat: AXm77 w 03 Czerwiec 2013, 15:43
Przeglądałeś tą stronę?
http://www.spy-hill.net/myers/help/boinc/Create_Project.html
Ten materiał w moim odczuciu jest trochę lepszy, przejrzałem i trochę zrozumiałem.
Spróbuję jutro znaleźć czas i wczytam się dokładniej, potem dam znać, czy coś z tego
wynikło

Pozdrawiam

Troll81

http://www.boincatpoland.org/wiki/Instalacja_serwera_BOINC_na_systemie_Debian_Wheezy

work in progres :D jak chcesz to dopisz cos od siebie.... bo u mnie temat zaginął w gąszczu codzienności....

mariotti

Cytat: Troll81 w 04 Czerwiec 2013, 18:20
http://www.boincatpoland.org/wiki/Instalacja_serwera_BOINC_na_systemie_Debian_Wheezy
work in progres :D jak chcesz to dopisz cos od siebie.... bo u mnie temat zaginął w gąszczu codzienności....
Jak ja bez znajomości zagadnienia zacząłbym o nim pisać, to dopiero wyszedłby bełkot :D

Troll81

Zapraszam do zapoznania się z tematem więc i poszerzenia łopatologa....

mariotti

Cytat: Troll81 w 05 Czerwiec 2013, 18:01
Zapraszam do zapoznania się z tematem więc i poszerzenia łopatologa....
Próbuję zapoznać się... ale idzie to koszmarnie powoli. Wczoraj, po kilkugodzinnej
próbie rozszyfrowania jakiegoś angielskiego tekstu, "dowiedziałem" się, że po
aktualizacji pakietów systemu boinc, trzeba sprawdzić czy w systemie operacyjnym
są pakiety w wersjach wymaganych przez nowe pakiety boinc. No dobra... może
kiedyś uniknę jakiegoś zaskoczenia, ale żeby unikać, to trzeba najpierw mieć coś
działającego ;-)


Pozdrawiam

mariotti

Na jakiej licencji jest MySQL do zastosowań w BOINC?

Z tego co pamiętam, MySQL był darmowy do:
- darmowych projektów,
- wszelkich aplikacji webowych.

A co z zastosowaniami w projektach BOINC?

Pozdrawiam

krzyszp

Jest na GPL, więc spokojnie można używać do wszystkich projektów, jedyynie przy rozpowszechnianiu MySQL z Twoją aplikacją ona również musi być na GPL.Zaznaczam, że to występuje tylko wtedy, gdy pliki MySQL (nie bazy jako takie!) rozpowszechniasz z Twoim programem.

Fajne zegarki :)
Należę do drużyny BOINC@Poland
 Moja wizytówka

mariotti

Cytat: krzyszp w 07 Czerwiec 2013, 15:42
Jest na GPL, więc spokojnie można używać do wszystkich projektów, jedyynie przy rozpowszechnianiu MySQL z Twoją aplikacją ona również musi być na GPL.Zaznaczam, że to występuje tylko wtedy, gdy pliki MySQL (nie bazy jako takie!) rozpowszechniasz z Twoim programem.
Coś mi się zdaje że to jest znacznie bardziej skomplikowane, dlatego ja kilka lat temu
przerzuciłem się całkowicie na Postgresa i mam z tym spokój. Idealnie byłoby, jakby
BOINCa skonfigurować do pracy z Postgresem, ale pewnie się nie da.

Zdaje się, że nawet w Stanach są sprzeczne wyroki spowodowane sprzeczną interpretacją tego
mglistego określenia z licencji GPL, a mianowicie chodzi o sformułowanie "utwory zależne". Jeśli
utwór jest zależny od czegoś na GPL, to w chwili publikowania, odbiorcy mają prawo do otrzymania
źródeł itd. Chyba nigdy nie będzie dla mnie jasne i oczywiste gdzie jest granica oddzielająca zależne od
niezależne. Podobnie nie jest dla mnie oczywiste kiedy dochodzi do publikacji utworu, a kiedy nie, np.
czy prezentacja wyników w htmlu na stronie www jest już publikacją czy nie jest?

Pozdrawiam