Zrównoleglenie listowania plików w openMP

Zrównoleglenie listowania plików w openMP
FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Witam, tak jak w temacie mam problem ze zrównolegleniem listowania plików w openMP. Zacznę od tego że pierwsze rekurencyjnie zapisuje wszystkie foldery oraz podfoldery które występują w podanej przez użytkownika lokalizacji, następnie w pętli for wywołując funkcję która znajduje pliki o podanym przez użytkownika zakresie rozmiaru i dat oraz wypisuje je. Właśnie tu jest problem i oto przedstawiam kod gdzie próbuje zrównoleglić to listowanie.

Kopiuj
#pragma omp parallel for shared(dirs, max_size, min_size, min_date_mili, max_date_mili)
    for (int i = 0; i < dirs.size() ; i++) {
        int id = omp_get_thread_num();
        listFiles(dirs[i], min_size, max_size, min_date_mili, max_date_mili);
       cout << "Hello from thread: " << id << " from " << omp_get_num_threads() << " threads" << endl;
    }

Chciałbym się dowiedzieć czy to jest odpowiednie zrównoleglenie, czy może istnieje lepszy sposób na to, a jeśli tak to w jaki sposób to zrównoleglić aby było najbardziej wydajne. Robiłem próby listowania na różnych ścieżkach i niestety wyniki nie są zadowalające :( Mam nadzieję że ktoś pomoże.

edytowany 7x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Przy listowaniu plików problemem będzie I/O (wydajność dysku), nie CPU - wielowątkowość tutaj nie ma zatem sensu.


WU
A jak katalog jest podlinkowany do ram-dysku, albo do dysku sieciowego?
Patryk27
@wurtur: tak, to są takie "special cases" - dlatego dodałem wprost w nawiasie: wydajność dysku + niżej też wytłumaczyłem przypadek, gdy może się to sprawdzić :-)
FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

A gdybym tylko znajdywał te pliki bez wypisywania ich ścieżek?

edytowany 1x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Lemme repeat: problemem jest wydajność dysku.
W jaki sposób wydajność dysku jest powiązana z tym, czy wypisujesz ścieżki, czy nie?


FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Hmmmm... to czemu dostałem takie zadanie do zrobienia skoro nie za bardzo da się go zrównoleglić.

edytowany 1x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Najwyraźniej dostałeś to zadanie aby się nauczyć, że nie zawsze można dorzucić więcej wątków na pałę, licząc na wzrost wydajności ;-)


FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0

Mam nadzieję że masz rację :D Może to jest podchwytliwe zadanie.

edytowany 1x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Warto tutaj wspomnieć o drobnym kruczku: wielowątkowość I/O nie ma sensu w przypadku pojedynczego dysku (koniec końców w jednej chwili dysk może odczytywać dane tylko z jednego miejsca, więc w danej chwili jeden wątek miałby dostęp do dysku, a reszta by czekała). Natomiast jeśli mamy do czynienia z wieloma dyskami, wielowątkowość może pomóc (w sytuacji jeden wątek per dysk oraz systemie operacyjnym z sensownym schedulerem I/O).


FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0
Patryk27 napisał(a):

Warto tutaj wspomnieć o drobnym kruczku: wielowątkowość I/O nie ma sensu w przypadku pojedynczego dysku (koniec końców w jednej chwili dysk może odczytywać dane tylko z jednego miejsca, więc w danej chwili jeden wątek miałby dostęp do dysku, a reszta by czekała). Natomiast jeśli mamy do czynienia z wieloma dyskami, wielowątkowość może pomóc (w sytuacji jeden wątek per dysk oraz systemie operacyjnym z sensownym schedulerem I/O).

Jeszcze pytanie mam bo gdyby podzielić na sekcję

Kopiuj
#pragma omp parallel sections
#pragma section
// petla wykonujaca jeden zbior
#pragma section
// petla wykonujaca drugi zbior
#pragma section
// petla wykonujaca trzeci zbior

Chodzi o to że każda z pętli równolegle by wykonywała jakiś zbiór ścieżek i sprawdzała czy pliki są w podanych kryteriach czy jednak dalej to nie jest osiągalne?

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Niezależnie ile wątków odpalisz, tylko jeden w danej chwili będzie miał dostęp do dysku, dlatego nie osiągniesz żadnego wzrostu wydajnościowego - chyba że masz zainstalowane wiele dysków, odpalisz swoje wyszukiwanie tak, aby był wątek per dysk, oraz będziesz działał na systemie wspierającym coś takiego - tak jak opisałem wyżej.

Analogicznie: załóżmy, że prędkość Twojego internetu wynosi 1 MB/s - jeśli odpalisz jedną przeglądarkę i będziesz tylko w niej pobierał plik, będzie on się pobierał z prędkością 1 MB/s. Jeśli jednak odpalisz dziesięć przeglądarek (co jest odpowiednikiem tych Twoich wątków) i w każdej z nich będziesz pobierał jeden plik, każdy z nich będzie się pobierał z prędkością 0.1 MB/s (sumarycznie dając 1 MB/s, ale mimo wszystko limitu nie przeskoczysz).


edytowany 7x, ostatnio: Patryk27
FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0
Patryk27 napisał(a):

Niezależnie ile wątków odpalisz, tylko jeden w danej chwili będzie miał dostęp do dysku, dlatego nie osiągniesz żadnego wzrostu wydajnościowego - chyba że masz zainstalowane wiele dysków, odpalisz swoje wyszukiwanie tak, aby był wątek per dysk, oraz będziesz działał na systemie wspierającym coś takiego - tak jak opisałem wyżej.

Analogicznie: załóżmy, że prędkość Twojego internetu wynosi 1 MB/s - jeśli odpalisz jedną przeglądarkę i będziesz tylko w niej pobierał plik, będzie on się pobierał z prędkością 1 MB/s. Jeśli jednak odpalisz dziesięć przeglądarek (co jest odpowiednikiem tych Twoich wątków) i w każdej z nich będziesz pobierał jeden plik, każdy z nich będzie się pobierał z prędkością 0.1 MB/s (sumarycznie dając 1 MB/s, ale mimo wszystko limitu nie przeskoczysz).

Dziwnie mnie strasznie że dostałem zadanie zrównoleglenia co jest napisane nawet w treści zadania skoro nie da się tego zrobić. No trudno najwyżej tak napiszę w raporcie i jeśli to miało być jednak w inny sposób zrobione to najwyżej poprawie, ale mam nadzieję że jednak nie będę musiał tego robić. Dzięki za pomoc.

koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
0
FocuSsmok07 napisał(a):
Patryk27 napisał(a):

Niezależnie ile wątków odpalisz, tylko jeden w danej chwili będzie miał dostęp do dysku, dlatego nie osiągniesz żadnego wzrostu wydajnościowego - chyba że masz zainstalowane wiele dysków, odpalisz swoje wyszukiwanie tak, aby był wątek per dysk, oraz będziesz działał na systemie wspierającym coś takiego - tak jak opisałem wyżej.

Analogicznie: załóżmy, że prędkość Twojego internetu wynosi 1 MB/s - jeśli odpalisz jedną przeglądarkę i będziesz tylko w niej pobierał plik, będzie on się pobierał z prędkością 1 MB/s. Jeśli jednak odpalisz dziesięć przeglądarek (co jest odpowiednikiem tych Twoich wątków) i w każdej z nich będziesz pobierał jeden plik, każdy z nich będzie się pobierał z prędkością 0.1 MB/s (sumarycznie dając 1 MB/s, ale mimo wszystko limitu nie przeskoczysz).

Dziwnie mnie strasznie że dostałem zadanie zrównoleglenia co jest napisane nawet w treści zadania skoro nie da się tego zrobić. No trudno najwyżej tak napiszę w raporcie i jeśli to miało być jednak w inny sposób zrobione to najwyżej poprawie, ale mam nadzieję że jednak nie będę musiał tego robić. Dzięki za pomoc.

Ależ da się zrobić -- napisano Ci tylko, że to nie da wzrostu wydajności. Ale zrównoleglić sobie możesz...

FS
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
0
koszalek-opalek napisał(a):
FocuSsmok07 napisał(a):
Patryk27 napisał(a):

Niezależnie ile wątków odpalisz, tylko jeden w danej chwili będzie miał dostęp do dysku, dlatego nie osiągniesz żadnego wzrostu wydajnościowego - chyba że masz zainstalowane wiele dysków, odpalisz swoje wyszukiwanie tak, aby był wątek per dysk, oraz będziesz działał na systemie wspierającym coś takiego - tak jak opisałem wyżej.

Analogicznie: załóżmy, że prędkość Twojego internetu wynosi 1 MB/s - jeśli odpalisz jedną przeglądarkę i będziesz tylko w niej pobierał plik, będzie on się pobierał z prędkością 1 MB/s. Jeśli jednak odpalisz dziesięć przeglądarek (co jest odpowiednikiem tych Twoich wątków) i w każdej z nich będziesz pobierał jeden plik, każdy z nich będzie się pobierał z prędkością 0.1 MB/s (sumarycznie dając 1 MB/s, ale mimo wszystko limitu nie przeskoczysz).

Dziwnie mnie strasznie że dostałem zadanie zrównoleglenia co jest napisane nawet w treści zadania skoro nie da się tego zrobić. No trudno najwyżej tak napiszę w raporcie i jeśli to miało być jednak w inny sposób zrobione to najwyżej poprawie, ale mam nadzieję że jednak nie będę musiał tego robić. Dzięki za pomoc.

Ależ da się zrobić -- napisano Ci tylko, że to nie da wzrostu wydajności. Ale zrównoleglić sobie możesz...

Źle się wyraziłem, oczywiście da się zrównoleglić ale to nie poprawia efektywności.

WU
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:8
0
FocuSsmok07 napisał(a):
Patryk27 napisał(a):

Niezależnie ile wątków odpalisz, tylko jeden w danej chwili będzie miał dostęp do dysku, dlatego nie osiągniesz żadnego wzrostu wydajnościowego - chyba że masz zainstalowane wiele dysków, odpalisz swoje wyszukiwanie tak, aby był wątek per dysk, oraz będziesz działał na systemie wspierającym coś takiego - tak jak opisałem wyżej.

Analogicznie: załóżmy, że prędkość Twojego internetu wynosi 1 MB/s - jeśli odpalisz jedną przeglądarkę i będziesz tylko w niej pobierał plik, będzie on się pobierał z prędkością 1 MB/s. Jeśli jednak odpalisz dziesięć przeglądarek (co jest odpowiednikiem tych Twoich wątków) i w każdej z nich będziesz pobierał jeden plik, każdy z nich będzie się pobierał z prędkością 0.1 MB/s (sumarycznie dając 1 MB/s, ale mimo wszystko limitu nie przeskoczysz).

Dziwnie mnie strasznie że dostałem zadanie zrównoleglenia co jest napisane nawet w treści zadania skoro nie da się tego zrobić. No trudno najwyżej tak napiszę w raporcie i jeśli to miało być jednak w inny sposób zrobione to najwyżej poprawie, ale mam nadzieję że jednak nie będę musiał tego robić. Dzięki za pomoc.

Da się zrobić i zrób. Ścieżka do katalogu to nie dysk lecz abstrakcja jakiegoś urządzenia.
Pozdrawiam

koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
1
FocuSsmok07 napisał(a):

Źle się wyraziłem, oczywiście da się zrównoleglić ale to nie poprawia efektywności.

A -- broniąc nieco wykładowcy :) -- powód dydaktyczny tego zadania może być taki, że jak dobrze zaprogramujesz, to zobaczysz w każdym uruchomieniu różne przeploty i będzie widać, że wykonuje się niesekwencyjnie. :)

WU
Tak. A poza tym wartość edukacyjna jest podobna jak innych, bardziej praktycznych przypadków.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)