Skocz do zawartości
Forum Kopalni Wiedzy
thikim

Obliczenia równoległe (wydzielone z "Jedna z zagadek tokamaków rozwiązana")

Rekomendowane odpowiedzi

 

W mojej pracy, ba karierze zawodowej, nie spotkałem się z problemem do którego musiałbym użyć równoległości.

A robiłeś animację przy jednoczesnym dość mocnym obciążeniu symulacją procesora?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

A robiłeś animację przy jednoczesnym dość mocnym obciążeniu symulacją procesora?

Najbliżej wielowątkowości byłem robiąc wywołania AJAX ;P a animacje to zrobiłem se strukturę organizacyjną bazując na http://bl.ocks.org/mbostock/4339083 i d3js. Niestety ktoś musi zajmować się rzemiosłem kiedy inni mają fun. :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cóż... Ajax jest zwykle wielowątkowy tylko po stronie klienta. Po stronie serwera dany klient zwykle dostaje tylko jeden wątek i reszta na niego czeka.

Podobno są metody na obejście tego, znaczy da się coś ustawić na serwerze, by się tak nie zachowywał... ale nigdy nie było mi to potrzebne. 

Ja się bawię tylko językami wysokopoziomowymi (głownie c-krzyżyk), więc wszystko jest stosunkowo proste i szybkie do napisania, a wydajnościowo wystarczające.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wtedy, w 2005 Ajax dopiero się narodził i był mi całkowicie nieznany (do dziś nie za wiele się zmieniło). Na pracy dyplomowej symulowałem przepuszczenie losowych ciągów bitowych przez kanał radiowy z różnymi metodami symulacji powstawania błędów.

I tak przy okazji sobie wpadłem że można by na tle graficznym puścić animację symulacji.
No więc puściłem i figa, wszystko zamierało.

Dopiero po puszczeniu w innym wątku wszystko pięknie chodziło (robiłem w Borlandzie C++ jeśli dobrze pamiętam nazwę).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

W mojej pracy, ba karierze zawodowej, nie spotkałem się z problemem do którego musiałbym użyć równoległości.

 

Nie wierzę ;)

Wystarczy, "dowolna" aplikacja z interfejsem graficznym która liczy cokolwiek a chcesz aby intefrejs graficzny reagował a nie zawieszał się ;)

I już masz co najmniej 2 wątki :D.

 

 

 

Chętnie dorzuciłbym do CV programik biegający na 1000 rdzeni ;P

Na początek (taniej) proponuję coś na GPU, np. masz tablice N -elementową i na każdym elemencie chcesz wykonać tę samą operację. Np. mnożysz razy dwa :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

Wystarczy, "dowolna" aplikacja z interfejsem graficznym która liczy cokolwiek a chcesz aby intefrejs graficzny reagował a nie zawieszał się I już masz co najmniej 2 wątki

Ja piszę w Webformsach. Tu jest problem jak POWSTRZYMAĆ użytkownika przed naciskaniem guzików na interfejsie zanim wróci odpowiedź z servera.

:D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wrzuć użytkownikowi jakieś popupy :D np. zdjęcia jakiś lasek :D (oczywiście najpierw po odpowiedzi że jest mężczyzną).

Wkur... ale zapobiegniesz :D

A na poważnie? Nie możesz zrobić jakiegoś "disable"?

Edytowane przez thikim

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
A na poważnie? Nie możesz zrobić jakiegoś "disable"?

Można, Ale żeby się nie bawić w javascripcie w przemiatanie kontrolek aspx i ustawianie disable - co na ogół wpływa na złe działanie submit - otaczam treść divem i po submit ustawiam w css display:none to ukrywa całą zawartość. Jak mam fantazję to jeszcze taką samą techniką pokazuję diva ze zdjęciami lasek ;P ale klient na ogół domaga się spinnerów. Szalenie powtarzalne i nudne. Jak masz 30 ekranów w aplikacji i w każdym tą samą technikę to aż się prosi by coś to zrobiło za Ciebie.

Edytowane przez Jajcenty

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość Astro

 

 

Na początek (taniej) proponuję coś na GPU, np. masz tablice N -elementową i na każdym elemencie chcesz wykonać tę samą operację. Np. mnożysz razy dwa

 

Nie prościej skleić całą tablicę w jedno słowo, które przesuwamy binarnie w lewo w jednym takcie? ;)

 

Przy okazji: dyskusja fajna, ale zastanawiam się, jak się mają popupy, laski, ekrany, GPU, Borland C++ (ech, pamiętam pierwsze wydania :)) itp. itd. do funkcjonalności tokamaków. ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

ale zastanawiam się, jak się mają popupy, laski, ekrany, GPU, Borland C++ (ech, pamiętam pierwsze wydania ) itp. itd. do funkcjonalności tokamaków.
 

Oj nie mają się, ale skoro już na to zeszłą dyskusja, to jeszcze dorzucę od siebie że insert dużej ilości danych do bazy danych najlepiej robić wielowątkowo, jeśli zależy na wydajności. Z testów nam wychodziło, że optymalna liczba wątków to 4 (czyli więcej niż u Pogo ;)). Przy dwóch wątkach wychodziła niemal dwa razy większa wydajność, później już nie rosła tak szybko, powyżej czterech zysk był już praktycznie niewidoczny. Używaliśmy C#, MS SQL Serwera i SqlBulkCopy. Inna sprawa, że nie w pełni wiadomo na jakim środowisku, bo uruchamialiśmy na maszynach wirtualnych i nie dało się wydobyć od administratorów, czy one siedzą na tym samym serwerze fizycznym, czy na różnych.

A pod C++ Buliderem, też zdarzyło mi się popełnić kod wielowątkowy, gdy trzeba było wyświetlać wyniki jakiegoś długo wykonującego się zapytania bez blokowania interfejsu użytkownika (w sumie taki jakby Ajax z epoki przedinternetowej) ;))

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

Nie prościej skleić całą tablicę w jedno słowo, które przesuwamy binarnie w lewo w jednym takcie?
 

 

Zależy co rozumieć przez "prościej".

"słowo" jak domniemam też inaczej rozumiemy (https://pl.wikipedia.org/wiki/S%C5%82owo_maszynowe

 

Poważniej,

Ty chcesz zrobić

1. Kupę "meczenia" z łączeniem, które nie ma uzasadnienia, bo możesz calość wykonać bez tego, w twojej wersji rozwiązania. Ot indeksujemy tę tablicę i wykonujemy tę operację

2. Wykonywać, przesuwanie (co jest dość problematyczne z Twoim taktem ;) przy tablicy większej niż mini mini.

3. Wykonywać po kolei tę funkcję (razem z krokiem 2)  N razy.

 

A cały myk polega na

1. "Wrzucasz" tablicę do GPU

2. odpalasz machinę, i funkcja równolegle wykonuje się na K (w zależności od ilości potoków i rdzeni) elementach.

3. odpalasz to N/K razy.

Przy np. 800 potokach (estrkemalnie upraszczając) masz przyspieszenie powiedzmy, że 800 krotne (to nie jest prawda, to zależy od funkcji którą wykonujesz a dokładniej czy ma "ify").

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Przy np. 800 potokach (estrkemalnie upraszczając) masz przyspieszenie powiedzmy, że 800 krotne

No przecież jedno nie przeszkadza drugiemu. Można to posłać do 800 potoków i przesunąć. Astro odniósł się do faktu, że kiedyś przesunięcie o bit było szybsze od dzielenia przez 2. Nie wiem jak jest teraz. 

A i Astro, w sposób nieuprawniony założyłeś starszeństwo bitów. :)

Mnie w obliczeniach równoległych bawi że podejście równoległe może być szybsze mimo wykonywania w jednym wątku, klasyczne bo: 2*(n/2)2 < n2

Edytowane przez Jajcenty

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

Astro odniósł się do faktu, że kiedyś przesunięcie o bit było szybsze od dzielenia przez 2.

 

Tak ale nie zalapałem po co mamy dzielić przez dwa? Dawno wątek był, było takie założenie?

Co do takich "myków" dawno, dawno temu, jeszcze pamiętam, jak musiałem mnożyć chyba przez 40 (chodziło o grafikę na Amidze i tam chyba ekran miał 320 pikesli, w każdym razie w tamtym przypadku tak było)

i okazało się, że przesunięcie o 5 bitów + o 3 bity, i dodanie tego, bylo szybsze niż po prostu przemnożenie (mówię o asemblerze). To były czasy gdzie zobaczyłeś, że coś przyspieszyło o naście procent i byłeś szczęśliwy

 

 

 

Mnie w obliczeniach równoległych bawi że podejście równoległe może być szybsze mimo wykonywania w jednym wątku, klasyczne bo: 2*(n/2)2 < n2
 

Tak to jest naprawdę niezłe :D

 

Co do wątku ludzie często zapominają, że przełączanie się między wątkami to też czas i myślą, że "wincyj, wincyj wątków" = lepiej.

To tak jak wsponiałem o tych potokach, ludzie myślą, że to rdzenie, i że to jest za***iste i w ogóle, a 1 if, zwalnia (upraszczając) już 2 krotnie dany fragment kodu(ten w bloku) 2 ifwy po kolei już 4 krotnie (oczywiście ekstremalnie uprościłem, bo są jescze faktycznie rdzenie itd.), w każdym razie puetna jest taka, że może dojść do tego (i to nie jest problem) że fragmetn kodu będzie działał szybciej na CPU niz GPU.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

Z testów nam wychodziło, że optymalna liczba wątków to 4

To wszystko zależy od liczby dostępnych wątków w procesora. Jeśli to były maszyny wirtualne to mogło być zupełnie losowo w zależności od obciążenia maszyny innymi procesami. Generalnie przyjmuje się, że maks liczby równoległych wątków nie może być większy od dostępnej liczby wątków procesora (zakładając, że absolutnie nic nie chodzi w tym czasie na bazie -> w praktyce błędne założenie).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...