Aktualności:

Czy uczestniczysz w Projekcie miesiąca?

Menu główne

Enigma Optima

Zaczęty przez Agbar, 16 Marzec 2016, 22:57

Jesteś zainteresowany/zainteresowana instalacją Enigma Optima. Jaki masz główny system operacyjny?

Windows 64 bit
10 (71.4%)
Windows 32 bit
1 (7.1%)
Linux 64 bit
3 (21.4%)
Linux 32 bit
0 (0%)
Inny
0 (0%)

Głosów w sumie: 14

Głosowanie skończone: 03 Kwiecień 2016, 20:43

Agbar

Teaser
Witajcie!
Po dłuższej przerwie wróciłem do mojego projektu optymalizacji enigmy. Widzę, że w międzyczasie sesef wydał swoją wersję, na szczęście moja jest szybsza (przynajmniej u mnie).

Trochę historii
W styczniu 2014 miałem wersję która działała zdecydowanie szybciej niż jakakolwiek kompilacja oryginalnego kodu 0.76.2. Poza tym, że mała część zadań zwracała błędy. Do tego na nieszczęście dostałem nową pracę i skończył mi się wolny czas %)

Projekt cały czas czekał na swoją kolej i w tym roku postanowiłem wygospodarować trochę "zasobów" na enigmę. Po czysto technicznych zmianach, jak migracja z Mercuriala (IMO przegrał wojnę z gitem) i przeniesienie z Bitbucket na Github mogłem zacząć odświeżać sobie znajomość kodu :attack:

Aktualny stan
Dość szybko znalazłem błąd, który prawdopodobnie był odpowiedzialny za niepoprawne wyniki sprzed dwóch lat. Wygląda na to, że to był naprawdę prosty błąd. Najwięcej czasu zajęła mi nauka google test (który jest bardzo prosty w użyciu, przynajmniej na tym poziomie, który jest wystarczający).

Szczegóły
Ta optymalizacja ma zaimplementowane 4 ścieżki (wersje):

  • Zoptymalizowaną wersję standardową.
  • Wersję SSSE3 (Intel Core 2+/Merom)
  • Wersję AVX (Sandy Bridge+)
  • Wersję AVX2 (Haswell)

Program wykrywa automatycznie dostępny zestaw instrukcji (CPUID) i wybiera najnowszy.
x86 < SSSE3 < AVX < AVX2

Zoptymalizowana wersja standardowa
Wymagany jest dowolny procesor. Kod został zmodyfikowany m.in. tak, aby symulować w GCC najważniejszą optymalizację, jaką robił kompilator Intela. Dzięki temu szybkość była porównywalna.

Wersja SSSE3
Najlepiej przetestowana. Mam dwa komputery, oba z procesorami Intel i5/i7 (pierwszej generacji). Działa szybko dzięki SIMD w szczególności operacji PSHUFB.

Wersja AVX
Kod źródłowy praktycznie nie różni się od wersji SSSE3, jednak może używać VEX. Nie spodziewam się dużej różnicy, szczególnie, że z VEXem wiąże się kilka pułapek wydajnościowych.1
Ogólnie sprawdzone działanie w SDE
Szybkość nieznana.

Wersja AVX2
Kod praktycznie nie przetestowany. Z tego co przeczytałem przetwarzanie rozszerzone na 256 bitów, ale pamiętam, że nie wiąże się to z dwukrotnym przyspieszeniem dekodowania.

Bardzo szybkie porównanie szybkości
Test jest bardzo prosty, użyłem My old Windows benchmark
Wyniki z Intel i5-M580 (SSSE3).





vanillasesefAgbar
obciążony43.930.737.4
nieobciążony20.313.711.2

Jak widać przy systemie obciążonym w 100% innymi programami jest tylko 15% przyspieszenia w porównaniu do standardowej kompilacji (prawdopodobnie Hyper Threading, enigma używa też relatywnie dużo pamięci cache). Wersja sesefa daje około 30% przyspieszenia.
Odwrotnie wygląda sytuacja przy nieobciążonym systemie: odcinamy 45% czasu działania w porównaniu do 33% u sesefa.

Co dalej?
Nie wiem, czy sesef opublikował kod źródłowy swojej wersji. Powinien, bo enigma jest licencjonowana GNU GPLv2 i wymaga publikacji kodu źródłowego. Jestem ciekawy jakie zmiany wprowadził, z tego co widziałem w zdekompilowanym kodzie musiał znaleźć inne podejście. Właściwie tylko szybko rzuciłem okiem na ten plik i wolałbym nie tracić czasu na reverse engineering. Wydaje mi się, że sesef "żyje" na BOINC Polish National Team. Jeżeli ktoś z Was mógłby go tam zagadnąć, będę wdzięczny.

Skompilowany plik udostępnię, gdy przejdzie mi dostatecznie dużo zadań na E@H. Powinno wystarczyć koło 100, nie chciałbym publikować wersji, która niepotrzebnie będzie zaśmiecać serwer. Co prawda TJM pisał mi kiedyś, że serwer da sobie z tym radę, ale po co go męczyć (już i tak error rate jest 5.6%...)

Pierwszą wersję chciałbym opublikować wewnętrznie dla naszej drużyny, żeby mieć w miarę kontrolowany zbiór użytkowników. Trzeba sprawdzić, jak aplikacja liczy w rzeczywistych warunkach, nie tylko na moich komputerach ;)

Wydaje mi się, że da się ten program przyspieszyć jeszcze o jakieś 10% (w porównaniu do moich aktualnych wyników) więc w sumie działałaby 2 razy szybciej niż standardowa. A jeszcze po dodaniu voodoo od sesefa, kto wie? Może zwracać wynik jeszcze przed rozpoczęciem obliczeń :fright:

Co o tym myślicie? Kto by się zgłosił do przetestowania?




  • Przejście ze zwykłego/starego kodowania instrukcji na kodowanie VEX wiąże się z dość długą karą w cyklach. Problem do rozwiązania, ale możliwe, że skończymy z dwoma plikami: SSSE3 i AVX+

krzyszp

Jeżeli będziesz miał 64bit Linux, to ja bardzo chętnie :)


Należę do drużyny BOINC@Poland
Moja wizytówka

PoznanskaPyra

Brzmi zachęcająco, jak by co chętny jestem. Linux/windows.
WIZYTÓWKA
Kompy:
AMD Ryzen 9-3900X + GTX980Ti
Intel i5 4570 + HD7970

sknd

też potestuję chętnie. Linux.

Cyfron

też mogę pomóc - Windows 10 x64, i5 Skylake

Agbar

#5
Dzięki za propozycje. Moje WU są jeszcze w drodze, więc trzeba chwilę zaczekać.

Wersja dla Linuxa powinna działać. W programie są chyba dwa miejsca zależne od OS: obsługa przerwania działania (Ctrl-C w Windows) i generator liczb losowych.
Trochę za słabo znam platformę, ale wydaje mi się że jak skompiluję np. na Arch-Linuksie, to będzie działać na innych? Poprawcie mnie, jeżeli się mylę.1

W międzyczasie w sprawie szybkości:
Uważaj co mierzysz!

Doznałem małego olśnienia i postanowiłem sprawdzić CPU time zamiast mierzenia czasu zegarowego.













vanillasesefAgbar
obciążony (czas zegarowy) 40.927.130.3
obciążony (czas CPU)240.926.322.4
obciążony (vanilla CPU%)100%65.1%55.7%
nieobciążony (czas zegarowy)20.513.811.2
nieobciążony (czas CPU)220.013.210.8
nieobciążony (vanilla CPU%)100%66.4%54.1%

Widać, że dzisiaj mam inaczej obciążony procesor ;) Nie liczy się WCG, tylko zadania enigmy. Za to bez wątpliwości moja wersja działa dużo szybciej.
O ile dobrze pamiętam zmieniłem ustawianie priorytetu na BACKGROUND, co oprócz obniżenia priorytetu planowania procesora obniża też priorytet innych zasobów. Przypuszczam, że dłuższy czas wykonania jest spowodowany oczekiwaniem na IO: enigma loguje każdy kolejny najlepszy wynik.
To może nie jest najlepszy wybór dla tych, którzy mają dedykowane maszyny do BOINC i chcieliby osiągnąć największą przepustowość (WU/h).




  • Arch jest jedną z niewielu dystrybucji z GCC 5+ w standardzie. Nie chcę się bawić z kompatybilnością z innymi kompilatorami, bo nie warto.
  • CPU time jest zmierzony z dokładnością -0/+500ms, czyli czasy mogą być większe nie więcej niż o 0.5s, ale to nie zmieni wyników zasadniczo.

Agbar

Przeliczyłem jakieś 200 próbek: 0 błędów. Jutro zrobię release, bo dzisiaj nie mam już na to czasu.

Troll81

 :respect: a nie chciałbyś pooptymalizwoać innych apek :D

WUPES

Chętnie potestuję :  32 WinXP SP3 POSR,  IntelQ9550 2,83GHz, BOINC client 7.4.26
Pozdrawiam

Agbar

#9
Opublikowałem pierwszą wersję alpha.

Plik jest zaszyfrowany. Hasło udostępnię przez wiadomości prywatne tu na forum. Zainteresowanych proszę o kontakt. Po prostu chcę wiedzieć kogo męczyć pytaniami, bo to bardzo wczesna wersja.


  • W tej wersji obsługiwany jest tylko Windows x64.
  • WUPES, planowałem nie wspierać 32 bitów. Twój procesor wspiera SSSE3, więc może się przekonam. Możliwe, że dotyczy cię problem z SSSE3 opisany poniżej.
  • Wersja dla Linux będzie dostępna jak tylko zainstaluję sobie Arch-Linux, niestety wcześniej muszę zdecydować, czy użyć Hyper-V, czy VBox. Oba rozwiązania mają poważne wady :(

W archiwum znajdują się 3 pliki,

  • basic używa zoptymalizowanego kodu bez SIMD. I tak jest szybsza niż wersja sesefa. Wg zasad poprzedniego testu osiąga ok. 12s. Ten kod praktycznie wymaga architektury x64 - ważna jest liczba rejestrów sprzętowych.
  • SSSE3 wymaga przynajmniej Intel Core 2+/Merom. Niestety w jądrze Merom operacja PSHUFB jest powolna (wg. agner.org). Dopiero któraś nowsza wersja będzie dostatecznie szybka (Wolfdale, ale może coś wcześniej). Nie ma wersji AVX, bo byłaby identyczna z SSSE3.
  • AVX2 wymaga przynajmniej procesora Haswell. Nie wiem jak szybko działa ta wersja.

Agbar

#10
Jak uruchomić optymalkę

Dla tych, którzy nigdy nie instalowali zoptymalizowanej enigmy małe How-To.

Zoptymalizowane programy BOINC obsługuje przez anonimową platformę. Ten mechanizm pozawala na uruchomienie klienta na egzotycznej platformie, np. kiedyś ARM; pozwala też na użycie własnych/specjalnych kompilacji - tak działają np. optymalki dla SETI i wszystkie inne.

Co jest potrzebne

  • Zainstalowany BOINC podłączony do projektu enigma@home ;)
  • Release enigma-optima
  • Pliki konfiguracyjne app_info.xml  itd. Najprościej użyć tych przygotowanych przez TJM na oficjalnym forum. Bezpośredni link do c2d.zip

Co z tym zrobić

Zakładam, że BOINC jest zainstalowany standardowo i dane są w c:\ProgramData\BOINC.1

Jeżeli masz inną optymalkę, wystarczy przy zatrzymanym BOINC podmienić exe (np. enigma_0.76_windows_intelx86.exe) na wybrany plik enigma-optima. Wystarczy skopiować i zmienić nazwę na zgodną z app_info.xml.

Operacje opisane są w widoku zaawansowanym BOINC Manager (w menu Widok-> Widok zaawansowany...)

Do rzeczy:
Opjonalne: Instalacja z oczekiwaniem na zakończenie zadań
Po zainstalowaniu optymalki BOINC porzuci wszystkie poprzednie zadania z projektu enigma@home. Przed kontynuowaniem prawdopodobnie chcesz doliczyć aktywne zadania do końca.
1. Wybierz zakładkę Projekty
2. Wybierz projekt Enigma@home
3. Z menu po lewej wybierz "Nie pobieraj danych"
4. Wybierz zakładkę Zadania
5. Wybierz "Pokaż wszystkie zadania" z menu po lewej
6. Wybierz wszystkie nierozpoczęte zadania Enigma@Home
7. "Przerwij" wybrane zadania przyciskiem w menu po lewej
8. Poczekaj aż zakończą się rozpoczęte zadania Enigma@Home
9. Wykonaj instalację Enigma Optima (poniżej)
10. Wybierz zakładkę projekty
11. Wybierz projekt Enigma@Home
12. Wybierz "Pobieraj nowe dane" w menu po lewej

Instalacja Enigma Optima
Właściwy proces instalacji.

1. Zatrzymaj klienta BOINC (Plik -> Zamknij podłączonego klienta...)
2. Otwórz folder projektu c:\ProgramData\BOINC\projects\www.enigmaathome.net\
3. Rozpakuj do niego pliki z c2d.zip. Należy pominąć folder c2d. Wszystkie pliki powinny być bezpośrednio w folderze projektu, np. c:\ProgramData\BOINC\projects\www.enigmaathome.net\app_info.xml.
4. Rozpakuj plik enigma-optima.basic.exe do folderu projektu.
5. Zmień nazwę enigma-optima.basic.exe na enigma_0.76_windows_intelx86.exe - nadpisz istniejący plik.
6. Uruchom ponownie klienta BOINC. (Plik -> Wybierz komputer...; pozostaw pola puste i kliknij OK)

Alternatywnie:
Jeżeli twój procesor ma AVX2 lub SSSE3 użyj pliku z odpowiednią nazwą zamiast enigma-optima.basic.exe.




  • Jeżeli masz zmienione opcje instalacji, to jako wytrawny hacker nie potrzebujesz tej instrukcji :)


Szopler

Zmiana nazwy pliku - błąd. Zamiast tego powinien być plik app_info.xml.

Agbar

Cytat: Szopler w 20 Marzec 2016, 18:24
Zmiana nazwy pliku - błąd. Zamiast tego powinien być plik app_info.xml.

Jesteś pewien, że przeczytałeś całość?
Plik app_info.xml pochodzi z c2b.zip i jest kopiowany.
A jeżeli chodzi Ci o to, żeby odpowiednia nazwa była w pliku app_info.xml, możesz przygotować taki plik. Na razie nie miałem na to czasu.

PDH

#13
Tak na szybko przetestowałem aplikacje na kilkunastu WU. Wszystkie przeliczone bezbłędnie
Procesor i7-4710HQ, liczone 3 zadania jednocześnie. Zegar 2,5-3,3GHz skacze ze względu chłodzenie laptopowe, przez to wyniki mogą być niemiarodajne:

Wersja Win32 SSE4.2 v2.0 by Sesef


Wysłane Czas zgłoszenia lub termin   Status Czas uruchomienia(sek) Czas procesora(sek) Punkty Aplikacja
20 Mar 2016, 13:38:02 UTC 20 Mar 2016, 13:49:46 UTC Completed and validated 686.05 683.05 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 14:34:01 UTC 20 Mar 2016, 14:57:23 UTC Completed and validated 1,377.84 1,373.20 60.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 14:34:01 UTC 20 Mar 2016, 14:57:23 UTC Completed and validated 1,380.18 1,375.30 60.00 Enigma 0.76b
Anonymous platform (CPU)


Wersja SSE3 Optima:

20 Mar 2016, 16:33:28 UTC 20 Mar 2016, 16:48:48 UTC Completed and validated 649.80 646.80 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 16:29:21 UTC 20 Mar 2016, 16:44:40 UTC Completed and validated 658.39  654.88   30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 16:23:07 UTC 20 Mar 2016, 16:40:29 UTC Completed and validated 636.62 633.58 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 16:18:57 UTC 20 Mar 2016, 16:33:28 UTC Completed and validated 623.67 620.09 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 15:57:43 UTC 20 Mar 2016, 16:18:57 UTC Completed and validated 1,204.88 1,201.16 52.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 15:57:43 UTC 20 Mar 2016, 16:23:07 UTC Completed and validated 1,338.75 1,334.06 60.00 Enigma 0.76b
Anonymous platform (CPU)


Wersja AVX2

20 Mar 2016, 18:18:33 UTC 20 Mar 2016, 18:32:54 UTC Completed and validated 599.96 597.39 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 18:18:33 UTC 20 Mar 2016, 18:32:54 UTC Completed and validated 604.66 601.45 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 18:02:18 UTC 20 Mar 2016, 18:28:45 UTC Completed and validated 1,311.78 1,307.08 60.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 17:51:12 UTC 20 Mar 2016, 18:18:33 UTC Completed and validated 653.50  648.36 30.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 17:31:28 UTC 20 Mar 2016, 17:55:21 UTC Completed and validated 1,186.19 1,181.44 60.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 17:31:28 UTC 20 Mar 2016, 17:55:21 UTC Completed and validated 1,170.60 1,166.80 60.00 Enigma 0.76b
Anonymous platform (CPU)
20 Mar 2016, 17:31:28 UTC 20 Mar 2016, 17:55:21 UTC Completed and validated 1,174.07 1,170.11 60.00 Enigma 0.76b
Anonymous platform (CPU)


Podsumowując: Dobra Robota :p_arr:

krzyszp

Moja maszyna z Windows na pokładzie ruszy jutro... Omyłkowo najpierw skopiowałem wersję AVX2 (a mam samo AVX) i niestety przekroczyłem limit dzienny.

Odnośnie ankiety - ja mam zarówno Linux64 jak i Windows64 ;)


Należę do drużyny BOINC@Poland
Moja wizytówka

Agbar

#15
Cytat: krzyszp w 20 Marzec 2016, 19:57
Omyłkowo najpierw skopiowałem wersję AVX2 (a mam samo AVX) i niestety przekroczyłem limit dzienny.
Dlatego na razie to jest zamknięta alfa ;) Właściwie specjalnie upośledziłem mój program, bo mam zaimplementowaną autodetekcję - chciałem żeby była możliwość porównania różnych wersji na tej samej maszynie.
U PDH widać, że AVX2 prawdopodobnie działa szybciej niż SSSE3. Miłe.
Cytat: krzyszp w 20 Marzec 2016, 19:57
Odnośnie ankiety - ja mam zarówno Linux64 jak i Windows64 ;)
Nie chciałem za bardzo komplikować. Jak możesz wybierz ten ważniejszy wg Ciebie:)



Myślę, że dobrze jakby każdy z testerów przeliczył ok. 100 próbek zanim pojedziemy dalej. W przypadku AVX2 wolałbym mieć ich jeszcze więcej, bo nie ufam sobie sprzed dwóch lat  :ph34r:

W sprawie linuksa: walczę z instalacją Arch. Jestem noobem w partycjonowaniu dla linuksa a liveCD gparted nie chce ruszyć na Virtual Box. :shame:

sesef

#16
Cytat: Agbar w 16 Marzec 2016, 22:57
Nie wiem, czy sesef opublikował kod źródłowy swojej wersji. Powinien, bo enigma jest licencjonowana GNU GPLv2 i wymaga publikacji kodu źródłowego. Jestem ciekawy jakie zmiany wprowadził, z tego co widziałem w zdekompilowanym kodzie musiał znaleźć inne podejście. Właściwie tylko szybko rzuciłem okiem na ten plik i wolałbym nie tracić czasu na reverse engineering. Wydaje mi się, że sesef "żyje" na BOINC Polish National Team. Jeżeli ktoś z Was mógłby go tam zagadnąć, będę wdzięczny.

Obie wersje, które się pojawiły bazują na kombinacji ustawieniami Intel Compiler-a, sam kod nie był zmieniany poza drobiazgami, które umożliwiły kompilację pod win. Intel Compiler bardzo dobrze potrafi optymalizować dostęp do pamięci stąd tak dobre wyniki niezależnie od tego czy liczymy na obciążonym czy nie komputerze. Natomiast optymalizacja samego kodu jest porównywalna z innymi kompilatorami czy to gcc czy vcc i z doświadczenia najlepiej zawsze wychodził pisany z palca kod na intrinsics-ach.

Starsza wersja (v 1.x) była kompilowana z tego co pamiętam ICC z 2008 albo 2010 i tutaj nie mam pewności czy coś jeszcze się nie zmieniło bo kod wsadowy dostałem od TJM-a. Kod raczej nie do odzyskania, chyba że jakaś kopia ostała się na którymś z HDD w szafie.

Nowsza wersja (v 2.0) kompilowana ICC 2013 albo 2014 tutaj standardowy kod modyfikowany tylko na potrzeby poprawnej kompilacji.

===============================================

Swego czasu prowadziłem trochę testów z nadzieją na AVX-512 w Skylake i dostęp do instrukcji vpermw (_mm512_permutexvar_epi16), która szacunkowo powinna przyspieszyć obliczanie score o 15-20% i dodatkowo odciążyć cache.

Robiłem też testy z instrukcjami gather. W tym przypadku dla Haswella jest 5-15% wolniej niż dla standardowego kodu natomiast przy Skylake oba rozwiązania są porównywalne.

Największą bolączką tej wersji algorytmu jest losowy dostęp do cache z dość sporą ilością błędnych trafień oraz mielenie prawie tych samych danych przy każdym kolejnym score. Dane wejściowe między dwoma wywołaniami funkcji score zmieniają się w niewielkim stopniu a i tak całościowy wynik jest liczony od początku (w sporej części przy obu wywołaniach odwołania pójdą do tych samych miejsc w pamięci w lookup_table.


Na szybko przejrzałem Twoje zmiany i kod bez poważnych przeróbek Intel Compilerem się nie skompiluje więc nawet nie mam co kombinować, a z braku czasu nie będę miał kiedy go dostosować (największym problemem jest brak obsługi __attribute__ ((vector_size(16))), tutaj trzeba by albo przerabiać kod albo napisać obsługę wszystkich potrzebnych operatorów dla używanych typów + wykorzystać standardowe __m128i/__m256i). Ze względu na taki charakter kodu przypuszczam, że pod windowsem całość kompilujesz przy pomocy mingw?

btw.
Sprawdzanie czy dana wersja liczy poprawnie bazując tylko na wyniku walidacji jest trochę błędne bo walidator potrafi przepuścić nawet błędnie policzone próbki. Tutaj lepszym rozwiązaniem byłoby z przeliczonych próbek mając startowego seed-a przeliczyć te wu ponownie niemodyfikowanym kodem.

Agbar

Cześć sesef!

Dzięki za zainteresowanie i uwagi.

Cytat: sesef w 20 Marzec 2016, 23:06
Obie wersje, które się pojawiły bazują na kombinacji ustawieniami Intel Compiler-a, sam kod nie był zmieniany poza drobiazgami, które umożliwiły kompilację pod win. Intel Compiler bardzo dobrze potrafi optymalizować dostęp do pamięci stąd tak dobre wyniki niezależnie od tego czy liczymy na obciążonym czy nie komputerze. Natomiast optymalizacja samego kodu jest porównywalna z innymi kompilatorami czy to gcc czy vcc i z doświadczenia najlepiej zawsze wychodził pisany z palca kod na intrinsics-ach.

Jeżeli nie było modyfikacji, to nie ma pomysłów do zaimportowania od Ciebie :(

Cytat: sesef w 20 Marzec 2016, 23:06
Swego czasu prowadziłem trochę testów z nadzieją na AVX-512 w Skylake i dostęp do instrukcji vpermw (_mm512_permutexvar_epi16), która szacunkowo powinna przyspieszyć obliczanie score o 15-20% i dodatkowo odciążyć cache.
AVX-512 jest dostępny tylko w serwerowych Skylake.
epi16 działa na shortach.  U mnie w kodzie wszystko zmniejszyłem do rozmiaru jednego bajta. Dzięki temu użycie cache jest dość niewielkie, chociaż i tak za duże. Nie pamiętam już dokładnie, ale tridict i bidict zajmują dużą część L1.
BTW. vpermw wygląda podobnie do PSHUFB, które jest kluczowe w mojej implementacji SIMD, ale działa niestety na 16 bitowych danych jak PSHUFLW/PSHUFHW. Pewnie kod z vpermw działałby szybciej niż aktualny AVX2: po rozszerzeniu wektora 8*32 na 16*32 powinno być mniej operacji potrzebnych do faktycznego obliczenia permutacji. Może nawet w jednej operacji da się to zmieścić. PSHUFB w AVX2 niestety działa jak dwie operacje PSHUFB, nie ma prawdziwego rozszerzenia na 32 bajty.

Cytat: sesef w 20 Marzec 2016, 23:06
Największą bolączką tej wersji algorytmu jest losowy dostęp do cache z dość sporą ilością błędnych trafień
Gdyby dostęp nie był losowy - czyli przewidywalny - nie mielibyśmy do czynienia z szyfrowaniem, prawda?

Cytat: sesef w 20 Marzec 2016, 23:06
oraz mielenie prawie tych samych danych przy każdym kolejnym score. Dane wejściowe między dwoma wywołaniami funkcji score zmieniają się w niewielkim stopniu a i tak całościowy wynik jest liczony od początku (w sporej części przy obu wywołaniach odwołania pójdą do tych samych miejsc w pamięci w lookup_table.
Rzeczywiście tak jest, ale wykrycie gdzie były zmiany mogłoby zająć więcej czasu niż przeliczenie od nowa. Tutaj też nie pomaga jakość oryginalnego kodu enigmy, który z pewnością "działa", ale nie wygląda jakby był napisany przez inżyniera oprogramowania ;)

Cytat: sesef w 20 Marzec 2016, 23:06
Na szybko przejrzałem Twoje zmiany i kod bez poważnych przeróbek Intel Compilerem się nie skompiluje więc nawet nie mam co kombinować, a z braku czasu nie będę miał kiedy go dostosować (największym problemem jest brak obsługi __attribute__ ((vector_size(16))), tutaj trzeba by albo przerabiać kod albo napisać obsługę wszystkich potrzebnych operatorów dla używanych typów + wykorzystać standardowe __m128i/__m256i). Ze względu na taki charakter kodu przypuszczam, że pod windowsem całość kompilujesz przy pomocy mingw?
Celowo odpuściłem sobie wsparcie dla innych kompilatorów. Skoro i tak są użyte intrinsics, które działają prawie jak wstawki assemblerowe, to kompilator nie ma pola do popisu przy automatycznej wektoryzacji. Może tylko lepiej lub gorzej zaplanować użycie rejestrów itp. A dodatkowa praca włożona w zgodność z wieloma kompilatorami raczej jest niewspółmierna do wyniku.

Cytat: sesef w 20 Marzec 2016, 23:06
Sprawdzanie czy dana wersja liczy poprawnie bazując tylko na wyniku walidacji jest trochę błędne bo walidator potrafi przepuścić nawet błędnie policzone próbki. Tutaj lepszym rozwiązaniem byłoby z przeliczonych próbek mając startowego seed-a przeliczyć te wu ponownie niemodyfikowanym kodem.
Lepiej byłoby mieć testy jednostkowe i trochę innych takich.
Nie modyfikowałem algorytmu optymalizującego (sic!, jeśli wierzyć nazwie to jest hillclimb), więc myślę, że można zaufać, że ta część działa nadal poprawnie. Zmodyfikowałem za to dekodowanie i obliczanie ocen. Tutaj na razie kod się trzyma na słowo honoru :) Pisałem go zanim odkryłem testy jednostkowe w C/C++, więc zmiany testowałem prawie ręcznie.
Jak chodzi o przeliczanie z tym samym seedem, to jest dosyć czasochłonne i wymaga modyfikacji kodu - trzeba by dodać jakiś przełącznik do linii poleceń. Wolę napisać sensowne unit testy, bo te przydadzą się przy ewentualnej dalszej modyfikacji. Na szczęście dekodowanie i wyliczanie ocen dobrze nadaje się do tego typu testów: to są dostatecznie małe fragmenty, dobrze oddzielone w kodzie (przynajmniej powinny być po moich zmianach).

krzyszp

Xeon E3-1230v2:
186762368 177026030 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 8:25:39 UTC Completed and validated 2,042.51 1,989.40 60.00 Enigma 0.76b v5.32
186762367 177026031 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 9:54:41 UTC Completed and validated 2,059.98 2,000.14 60.00 Enigma 0.76b v5.32
186762366 177026043 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 5:18:03 UTC Completed and validated 1,996.71 1,967.14 60.00 Enigma 0.76b v5.32
186762365 177025987 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 10:09:26 UTC Completed and validated 3,611.07 3,524.44 105.00 Enigma 0.76b v5.32
186762362 177025952 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 4:40:09 UTC Completed and validated 2,138.48 2,002.19 60.00 Enigma 0.76b v5.32
186762361 177025951 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 5:22:11 UTC Completed and validated 2,006.69 1,954.54 60.00 Enigma 0.76b v5.32
186762359 177025969 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 10:03:27 UTC Completed and validated 3,668.55 3,578.79 105.00 Enigma 0.76b v5.32
186762358 177025968 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 1:12:14 UTC Completed and validated 2,170.62 2,017.73 60.00 Enigma 0.76b v5.32
186762357 177026045 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 1:46:09 UTC Completed and validated 2,052.35 1,964.61 60.00 Enigma 0.76b v5.32
186762356 177026044 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 5:35:47 UTC Completed and validated 1,988.06 1,961.68 60.00 Enigma 0.76b v5.32
186762355 177026046 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 3:50:53 UTC Completed and validated 2,122.70 2,006.19 60.00 Enigma 0.76b v5.32
186762354 177026047 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 7:35:32 UTC Completed and validated 2,100.24 1,997.06 60.00 Enigma 0.76b v5.32
186762351 177026050 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 7:52:00 UTC Completed and validated 2,090.49 1,997.58 60.00 Enigma 0.76b v5.32
186762350 177026049 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 7:29:09 UTC Completed and validated 2,112.88 2,053.14 60.00 Enigma 0.76b v5.32
186762349 177026051 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 2:22:06 UTC Completed and validated 2,128.00 1,999.12 60.00 Enigma 0.76b v5.32
186762348 177025921 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 8:04:27 UTC Completed and validated 2,018.32 1,988.53 60.00 Enigma 0.76b v5.32
186762347 177025920 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 8:25:39 UTC Completed and validated 2,064.70 1,978.20 60.00 Enigma 0.76b v5.32
186762345 177025918 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 3:20:42 UTC Completed and validated 2,227.00 1,997.98 60.00 Enigma 0.76b v5.32
186762340 177026016 80842 20 Mar 2016, 22:48:21 UTC 20 Mar 2016, 23:27:13 UTC Completed and validated 2,146.02 2,010.46 60.00 Enigma 0.76b v5.32
186762331 177026058 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 3:59:12 UTC Completed and validated 2,126.23 2,014.64 60.00 Enigma 0.76b v5.32


Należę do drużyny BOINC@Poland
Moja wizytówka

Agbar

#19
Cytat: krzyszp w 21 Marzec 2016, 12:38
Xeon E3-1230v2:
186762368 177026030 80842 20 Mar 2016, 22:48:21 UTC 21 Mar 2016, 8:25:39 UTC Completed and validated 2,042.51 1,989.40 60.00 Enigma 0.76b v5.32
Chyba coś się nie udało przy instalacji, bo nie masz anonymous platform w wynikach. Twój host: 80842 ma tylko
CytatEnigma 0.76b 5.32 windows_intelx86
a np. mój 68361 ma dodatkowo
CytatEnigma 0.76b (anonymous platform, CPU)

Może zamieniłeś exe bez restartowania klienta BOINC?
Możesz też podać której wersji użyłeś (zakładam, że SSSE3) i mniej więcej jak długo WU liczyły się na poprzedniej wersji którą miałeś?

krzyszp

Tak, SSE3, pliki wykonywalne podmieniłem.


Należę do drużyny BOINC@Poland
Moja wizytówka

Agbar

Udało mi się zainstalować Arch Linuksa. Po instalacji systemu od zera naprawdę polubiłem ten OS  :arrr:

Mam już nawet skompilowane pliki do wrzucenia na release, tylko muszę to zebrać do kupy. W tym tygodniu mam trochę mniej czasu, więc może mi to zająć nawet ze dwa dni.

Jak idą testy na Windowsach? Czy działa szybciej i jak dużo szybciej?

PDH

#22
Miałem dziś chwilkę i porobiłem dokładniejsze testy. Konfiguracja jak wcześniej, zegar na sztywno 2,5GHz. 4 zadania / 4 rdzenie, obciążenie 100%.
Link do zadań.

Procentowy wzrost wydajności (czas procesora-średnia ze wszystkich próbek)
App Sesef v2 -100%
Optima sse3 - 89,16%
Optima avx2 - 79,03%

Ogólnie bardzo przyzwoicie to wygląda.

Agbar

W końcu przygotowałem wersję na Linuksa: alpha 2
Tak jak z Windowsem (alpha.1), na razie są osobne pliki dla zwykłego kodu, SSSE3 i AVX2. Sprawdźcie, czy na pewno wasz procesor jest zgodny z użytym plikiem wykonywalnym, bo możecie skończyć jak kszyszp  ;)

O ile znam Linuksa (a nie znam) pliki są zlinkowane statycznie, więc nie mają żadnych zależności. Sprawdziłem, że działają na Arch i Debianie.

PDH, dzięki za porównanie szybkości. Wygląda, że AVX2 może być ponad dwa razy szybsza od standardowej apki projektu :fright:

Pomijając szybkość, bardzo ważne jest, czy nie ma błędów WU. Na razie nie widziałem żadnego, ale jak wam się zdarzy zgłoście proszę (np. w tym wątku). Powinna wystarczyć nazwa zadania.

PoznanskaPyra

Ja właśnie zapuściłem na swój procek i7-4770k 4 wątki. Jak przeliczy, to dam pełne 8 wątków i dla porównania na i5-4570 też uruchomię.
WIZYTÓWKA
Kompy:
AMD Ryzen 9-3900X + GTX980Ti
Intel i5 4570 + HD7970

Agbar

Fajnie, bo oba Twoje procki mają AVX2.

Agbar

Specjalnie dla WUPES zrobiłem wersję dla Win32.

SSSE3 jest praktycznie tak samo szybkie jak na x64.
Wersja generic jest dosyć powolna. Pewnie da się to poprawić, ale nie na razie nie ma dla kogo.

@WUPES nie próbuj wersji AVX2, bo twój procek tego nie obsłuży.

PoznanskaPyra

AVX

Intel Core i7-4770k 4WU Windows 10 Pro



187816441 178041319 26 Mar 2016, 18:50:56 UTC 26 Mar 2016, 19:13:44 UTC Completed and validated 1,206.73 1,197.77 60.00 Enigma 0.76b
Anonymous platform (CPU)
187816066 178040989 26 Mar 2016, 18:50:56 UTC 26 Mar 2016, 19:13:44 UTC Completed and validated 1,211.69 1,201.42 60.00 Enigma 0.76b
Anonymous platform (CPU)
187816022 178040988 26 Mar 2016, 18:50:56 UTC 26 Mar 2016, 19:13:44 UTC Completed and validated 1,201.97 1,193.00 60.00 Enigma 0.76b
Anonymous platform (CPU)
187815423 178040296 26 Mar 2016, 18:50:56 UTC 26 Mar 2016, 19:09:38 UTC Completed and validated 1,102.16 1,092.95 52.00 Enigma 0.76b
Anonymous platform (CPU)



Intel Core i7-4770k 8WU Windows 10 Pro


188000908 178206399 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:23:18 UTC Completed and validated 2,383.85 2,303.55 105.00 Enigma 0.76b
Anonymous platform (CPU)
188000907 178206320 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:07:44 UTC Completed and validated 1,565.19 1,482.47 60.00 Enigma 0.76b
Anonymous platform (CPU)
188000861 178206390 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:19:12 UTC Completed and validated 2,362.00 2,310.77 105.00 Enigma 0.76b
Anonymous platform (CPU)
188000714 178206271 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:07:44 UTC Completed and validated 1,533.70 1,483.14 60.00 Enigma 0.76b
Anonymous platform (CPU)
188000637 178206101 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:07:44 UTC Completed and validated 1,454.18 1,371.89 52.00 Enigma 0.76b
Anonymous platform (CPU)
188000515 178206046 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 18:58:13 UTC Completed and validated 893.46 817.19 30.00 Enigma 0.76b
Anonymous platform (CPU)
188000427 178205807 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 19:03:35 UTC Completed and validated 1,433.68 1,381.55 52.00 Enigma 0.76b
Anonymous platform (CPU)
188000385 178205896 27 Mar 2016, 18:39:27 UTC 27 Mar 2016, 18:54:08 UTC Completed and validated 859.68 812.86 30.00 Enigma 0.76b
Anonymous platform (CPU)




Intel Core i5-4570 4WU Windows 10 Pro


188008942 178214392 27 Mar 2016, 19:49:56 UTC 27 Mar 2016, 20:04:30 UTC Completed and validated 860.54 851.77 52.00 Enigma 0.76b
Anonymous platform (CPU)
188008930 178214509 27 Mar 2016, 19:49:56 UTC 27 Mar 2016, 19:58:22 UTC Completed and validated 487.06 479.05 30.00 Enigma 0.76b
Anonymous platform (CPU)
188008897 178214511 27 Mar 2016, 19:49:56 UTC 27 Mar 2016, 19:58:22 UTC Completed and validated 488.08 479.98 30.00 Enigma 0.76b
Anonymous platform (CPU)
188008896 178214510 27 Mar 2016, 19:49:56 UTC 27 Mar 2016, 19:58:22 UTC Completed and validated 487.06 479.05 30.00 Enigma 0.76b
Anonymous platform (CPU)
WIZYTÓWKA
Kompy:
AMD Ryzen 9-3900X + GTX980Ti
Intel i5 4570 + HD7970

sknd

jak "zaionstalować" optime pod linuxem? zatrzymuję boinca, podmieniam odpowiedni plik wykonywalny, nadaję mu uprawnienia "wykonywalny" i robię jego właścicielem usera boinc, ale potem po odpaleniu boinca:


wto, 29 mar 2016, 18:47:06 | Enigma@Home | File projects/www.enigmaathome.net/enigma_5.32_i686-pc-linux-gnu has wrong size: expected 502068, got 1306064

i ściaga sobię binarke od nowa...

jak zyć?  ;)

Agbar

#29
Sama podmiana pliku wykonywalnego nie jest poprawnym rozwiązaniem (chociaż wielu z Was tego próbuje - widziałem w logach serwera %) )

Musisz mieć plik app_info.xml, Wcześniej pisałem jak zrobić to w Windows:
Cytat: Agbar w 20 Marzec 2016, 18:20
Jak uruchomić optymalkę

Niestety dla Linuksa sprawa może być trochę bardziej skomplikowana, bo TJM daje trochę bardziej złożony plik app_info i nie chciało mi się wcześniej rozgryzać o co tam chodzi.
Spróbuj tak:
1. Pobierz ten plik umieszczony przez TJM na oficjalnym forum.
2. Rozpakuj go do folderu projektu.
3. Podmień plik enigma_0.76_i686-pc-linux-gnu na wybrany plik z release Enigma Optima.

Powinno zadziałać.


sknd

tym razem
wto, 29 mar 2016, 21:41:17 | Enigma@Home | Wiadomość z serwera: Unknown app name in app_info.xml

Agbar

Spróbuję coś wyrzeźbić. A może ktoś ma aktualne app_info dla Linuksa?

stasieks

Działa bardzo dobrze, bez błędów. Zainstalowałem wersje alpha1 SSE3. Win64, procesor Intel i7-3632qm.

Bez optymalki:
3,628.35    3,449.01    52.00    Enigma 0.76b v5.32
2,074.95    1,989.75    30.00    Enigma 0.76b v5.32
2,204.43    2,019.67    30.00    Enigma 0.76b v5.32
2,143.07    2,040.60    30.00    Enigma 0.76b v5.32
2,221.60    2,029.11    30.00    Enigma 0.76b v5.32

Z optymalizacją:
2,413.87    2,141.13    52.00    Enigma 0.76b Anonymous platform (CPU)
1,590.45    1,206.28    30.00    Enigma 0.76b Anonymous platform (CPU)
1,304.62    1,205.50    30.00    Enigma 0.76b Anonymous platform (CPU)
1,396.01    1,355.21    30.00    Enigma 0.76b Anonymous platform (CPU)
1,510.11    1,197.78    30.00    Enigma 0.76b Anonymous platform (CPU)

sknd

jednak zassało mi trochę WU, więc:
(Linux64, e3-1230-v2)

1,042.42   987.42     30.00        Enigma 0.76b Anonymous platform (CPU)
1,004.64   982.11    30.00        Enigma 0.76b Anonymous platform (CPU)
1,003.32   980.30    30.00   Enigma 0.76b Anonymous platform (CPU)
409.36       928.71    30.00   Enigma 0.76b Anonymous platform (CPU)
166.32       1,031.08    30.00   Enigma 0.76b Anonymous platform (CPU)
995.49       963.95    30.00   Enigma 0.76b Anonymous platform (CPU)
1,015.26   973.49    30.00   Enigma 0.76b Anonymous platform (CPU)
1,016.91   973.86    30.00   Enigma 0.76b Anonymous platform (CPU)
1,031.33   974.69    30.00   Enigma 0.76b Anonymous platform (CPU)
1,012.35   976.79    30.00   Enigma 0.76b Anonymous platform (CPU)
1,003.31   980.11    30.00   Enigma 0.76b Anonymous platform (CPU)
1,010.89   984.92    30.00   Enigma 0.76b Anonymous platform (CPU)
1,012.93   986.36    30.00   Enigma 0.76b Anonymous platform (CPU)
1,009.53   986.06    30.00   Enigma 0.76b Anonymous platform (CPU)
1,028.97   988.53    30.00   Enigma 0.76b Anonymous platform (CPU)
1,051.71   983.28    30.00   Enigma 0.76b Anonymous platform (CPU)

Agbar

Ciekawe, masz taki sam procesor jak krzyszp, ale działa trochę szybciej.

sknd

a wszystkie WU są tej samej długości?

Agbar

Cytat: sknd w 01 Kwiecień 2016, 15:02
a wszystkie WU są tej samej długości?

Domyślam się, że nie. TJM wie lepiej, jak to jest, a może jest gdzieś informacja na forum projektu.
Na moje oko rozmiar zadania można rozpoznać po ilości punktów (30, 52, 60...). Wszystkie 30 powinny mieć tyle samo do policzenia, itd.

Popatrz np. na wyniki:
Cytat: stasieks w 30 Marzec 2016, 14:45
Bez optymalki:
3,628.35    3,449.01    52.00    Enigma 0.76b v5.32
2,074.95    1,989.75    30.00    Enigma 0.76b v5.32

Z optymalizacją:
2,413.87    2,141.13    52.00    Enigma 0.76b Anonymous platform (CPU)
1,590.45    1,206.28    30.00    Enigma 0.76b Anonymous platform (CPU)

Z proporcji
2000/30*52 = ~3460,
1200/30*52 = 2080.

Przypuszczam, że serwer jakoś dopasowuje rozmiar WU do szybkości klienta. Pewnie optymalizuje obciążenie (turnaround time itd.)

krzyszp

Cytat: Agbar w 01 Kwiecień 2016, 13:12
Ciekawe, masz taki sam procesor jak krzyszp, ale działa trochę szybciej.
Bo u mnie ten komp ma jednocześnie kilkadziesiąt zakładek w FF otwartych, kilkanaście w Operze, i jeszcze stado softu w tle ;)


Należę do drużyny BOINC@Poland
Moja wizytówka

sknd

Cytat: krzyszp w 01 Kwiecień 2016, 20:16
Cytat: Agbar w 01 Kwiecień 2016, 13:12
Ciekawe, masz taki sam procesor jak krzyszp, ale działa trochę szybciej.
Bo u mnie ten komp ma jednocześnie kilkadziesiąt zakładek w FF otwartych, kilkanaście w Operze, i jeszcze stado softu w tle ;)
no pewnie tu pies pogrzebany, u mnie miał tylko trochę softu, ale zakładek było co najwyżej parę  ;)

Agbar

Opublikowałem nową wersję v1.0.0-alpha.4
Zmiany to:

  • Jedna wersja exe. Program sam wybiera najlepszy dostępny zestaw instrukcji.
  • Gotowy app_config.xml. Wystarczy skopiować do folderu projektu w BOINC.

Z tym kopiowaniem nie jest jeszcze zupełnie prosto. Potrzebny jest jeszcze wrapper, który można pobrać ze strony Enigma@Home. Dla Windows i Linux potrzebny jest wrapper w wersji 5.32. Jak napiszę do TJMa, to może pozwoli zapakować wrapper razem z Optimą.

Pamiętajcie aby w Linuksie poprawnie ustawić uprawnienia.
Np. u mnie w Arch user boinc musi mieć uprawnienie do wykonania aplikacji, więc muszę ustawić:
chusr boinc:boinc enigma-optima
chmod u+x,g+x  enigma-optima

To samo dla wrappera, jeżeli BOINC manager go wywali przez przypadek (np. przy błędnej konfiguracji.)
W Linuksie x64 sprawdźcie też czy macie zainstalowane zależności dla wrappera, który jest 32 bitowy. W Arch trzeba włączyć multilib, ale inne dystrybucje są prostsze w obsłudze  8)