• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wiele wątków o krótkim działaniu. działa wolniej.

Object Storage Arubacloud
0 głosów
281 wizyt
pytanie zadane 19 lipca 2020 w C i C++ przez zima1978 Nowicjusz (120 p.)

Witam wszystkich.

Poszukuję rozwiązania dotyczącego wykorzystania rdzeni do obliczeń sieci neuronowej.

Mam przykładowo 100 wejść i 10 neuronów do każdego neuronu obliczam 100 wejść razy synapsy i sumuję. 

 

b[i-1][j]+= b[i][k]*wagi[i-1][k][j]; 

robię 10 wątków w którym każdy oblicza 100 wejść.

Cała procedura z tworzeniem wątków zabiera za dużo czasu.
Czy mogę zrobić wątek, który będę go tylko włączał i wyłączał a nie kasował i robił od nowa?
Jakieś pomysły?

Oczywiście przeglądałem internet ale ciężko uzyskać szczegółowe informacje.
z góry dziękuję za podpowiedzi.


        std::vector<std::thread> watki;
        std::thread t;

            for(j=1; j<tw[i-1]; j++)
            {
                t = thread(oblicz_blad_th,this,i,j,tw[i]);
                watki.push_back(std::move(t));

            }

            for (std::thread & th : watki)
            {
                if (th.joinable())
                {
                    th.join();
                }
            }

 

3 odpowiedzi

+2 głosów
odpowiedź 20 lipca 2020 przez mokrowski Mędrzec (155,460 p.)

Po pierwsze (czego nie jestem pewien z Twojego kodu), nie traktuj neuronu jako obiektu. To podejście spowoduje bardzo szybkie osiągnięcie sufitu wydajności. Traktuj wszystkie wagi danej warstwy jako macierze które mnożysz (bo wynik dla danego neuronu to "dot product"). I to jest zadanie dla potencjalnych wątków.

Po drugie, wydajność wątków bardzo silnie zależy od % trafialności w cache (tu nie będę rozwijał którego poziomu L* i jaka jest architektura systemu). Ogólnie nie opłaca się zlecania wątkom "małych prac", bo będą "szamotały" się z innymi o zasoby w cache i dojdzie do zjawiska fałszywego współdzielenia (ang. false sharing). Tak więc tylko macierze które wypełniają w wystarczającym stopniu cache, opłaca się zlecać do wątku.

Po trzecie, jeśli już chcesz tworzyć wątki zgodnie ze wzorcem puli wątków (ang. thread pool), powinieneś opanować pojęcia związane ze zmiennymi decyzyjnymi (ang. condition variable), oraz spakowanego zadania (ang. packaged task). Bez tych pojęć będzie Ci trudno zaimplementować pulę w C++.

Po czwarte, dobrze jest mieć świadomość, że dziś tego typu rzeczy (macierze, AI), liczy się raczej na kartach graficznych. Niemniej jednak jeśli traktujesz Twój pomysł jako ćwiczenie, jest najbardziej ok. Tylko "nie ostrz sobie zębów" na ekstremalną wydajność :)

Klika linków, wraz z przykładami do poczytania:

https://en.cppreference.com/w/cpp/thread/packaged_task

https://en.cppreference.com/w/cpp/thread/condition_variable

https://www.codeproject.com/Articles/3607/Work-Queue

 https://en.wikipedia.org/wiki/Thread_pool

 

komentarz 20 lipca 2020 przez zima1978 Nowicjusz (120 p.)

Wielkie dzięki wszystkim.

Thread_pool o to mi chodziło a Work-Queue,  przyjrze się.

Nie traktuję neuronu jako obiektu. 

co do cache to się muszę chyba głębiej zastanowić.

Rozwiązaniem może być grupowanie neuronów np po 8.

mam 12 rdzeni u siebie i aż żal patrzeć, że tego nie wykorzystuje.

 

 

komentarz 20 lipca 2020 przez mokrowski Mędrzec (155,460 p.)
Dość dobrze wytłumaczone. Nie wiem czy jest potrzeba uzupełniania wiedzy o algebrze liniowej, ale jeśli obejrzysz te odcinki, poukłada Ci się w głowie :)

Obejrzeć w kolejności:

https://www.youtube.com/watch?v=FmD1S5yP_os&list=PL-wATfeyAMNrtbkCNsLcpoAyBBRJZVlnf&index=4

https://www.youtube.com/watch?v=QUCzvlgvk6I&list=PL-wATfeyAMNrtbkCNsLcpoAyBBRJZVlnf&index=5

https://www.youtube.com/watch?v=ScL18goxsSg&list=PL-wATfeyAMNrtbkCNsLcpoAyBBRJZVlnf&index=7

 

To że to Python, naprawdę nie ma znaczenia tutaj... (btw, cały cykl jest fajny)

W standardzie C++17, już zaadresowano problem false sharing: https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size
komentarz 20 lipca 2020 przez zima1978 Nowicjusz (120 p.)
dziękuję. Sprawdzę i to. ale muszę mieć troszeczkę czasu aby to zrobić.
0 głosów
odpowiedź 19 lipca 2020 przez tkz Nałogowiec (42,000 p.)

Koszt przydziału zasobów na osobny wątek jest niejednokrotnie większy, niż wykonanie zadanie sekwencyjnie. Po za tym koszt przełączania kontekstu też jest spory. 

Po za uwagą wyżej. źle działasz na vectorze. 

for(j=1; j<tw[i-1]; j++)
{
  watki.emplace_back(oblicz_blad_th,this,i,j,tw[i]);
}

Dodatkowo możesz spojrzeć na termin wektoryzacji. 

komentarz 19 lipca 2020 przez Wiciorny Ekspert (269,790 p.)
mutex?
komentarz 21 lipca 2020 przez tkz Nałogowiec (42,000 p.)
W kontekście czego? Bo nie mogę go powiązać z niczym co napisałem.
0 głosów
odpowiedź 19 lipca 2020 przez mbabane Szeryf (79,280 p.)

Czy mogę zrobić wątek, który będę go tylko włączał i wyłączał a nie kasował i robił od nowa?

Tzw. pula wątków. Czyli określasz z góry że masz np. 10 wątków i są one stworzone i czekają na użycie, i jeśli wynika potrzeba skorzystania z wątku to brane są one z tej puli - czyli wątek jako wątek tworzony jest tylko raz. Niestety jak to się robi w Cpp nie wiem, ale mogę się założyć, że są do tego gotowe narzędzia/biblioteki.

komentarz 19 lipca 2020 przez tkz Nałogowiec (42,000 p.)
Nie, bynajmniej nie w kodzie pytającego. Żadna ilość wątków nie jest gotowa do użycia przed wejściem w pierwszą pętlę.
komentarz 19 lipca 2020 przez zima1978 Nowicjusz (120 p.)
Tak też chciałem zrobić.

utworzyć tablicę na początku z wątkami i je zatrzymać i uruchamiać.

Na razie nie wiem jak to zrobić, taką tablicę z wątkami.

Gdy robiłem thread watki[x]; to działy się różne rzeczy :)

teraz też nie jest idealnie.

Staram się przełożyć klase Percepton na wiele rdzeni.

Mam jakiś błąd bo zamiast 12 watków na początku mam 48 a potem 3 razy 12 ;)

co do vectora to korzystałem z poradnika.

dziękuję za odpowiedzi.
komentarz 19 lipca 2020 przez mbabane Szeryf (79,280 p.)

@tkz, 

Pojęcie puli wątków jest w tym wypadku ogólnym stwierdzeniem, a nie odniesieniem do kodu pytającego.

https://en.wikipedia.org/wiki/Thread_pool

Podobne pytania

+1 głos
4 odpowiedzi 410 wizyt
pytanie zadane 21 czerwca 2017 w C i C++ przez wanttobeanengineer Obywatel (1,120 p.)
0 głosów
1 odpowiedź 426 wizyt
pytanie zadane 1 grudnia 2016 w Java przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez Storm Obywatel (1,570 p.)

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...