Zrównoleglenie listowania plików w openMP

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.

#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.

1

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

0

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

0

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

0

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

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 ;-)

0

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

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).

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ę

#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?

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).

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.

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...

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.

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

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. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1