Skocz do zawartości

Recommended Posts

Napisano

Napisałem prostego bruteforce'a. Aby przyspieszyć działanie i wykorzystać możliwości obu rdzeni, podzieliłem liczenie na dwa wątki (parzyste/nieparzyste). Dało to wymierny efekt - zamiast 50% zużycia procka, mam teraz średnio 92%. Każdy wątek ma wydzielony kawałek pamięci, do którego swobodnie pisze i czyta. Jest tylko jeden bajt współdzielony - flaga określająca czy globalnie znaleziono rozwiązanie czy nie. Niestety program mi nie działał. Nie miałem jak go debugować, bo Olly pod x86-64 nie działa, fdbg wykrzacza się, a WinDbg nie umiem używać. Więc klasycznie napisałem sobie zrzucanie każdego pośredniego wyniku liczenia do pliku. I nagle bruteforce zaczął działać! Dodałem tylko linijkę z WriteFile. Kiedy usunę tą linijkę, na powrót bruteforce nie działa. Jak to jest możliwe? Linijka kodu z WriteFile, jest dla obliczeń niczym "nop". W żaden sposób nie zmienia toku liczenia. Czy ktoś z was się może spotkał z czymś takim? Dla mnie to jakieś niepojęte jest. Przychodzi mi do głowy tylko jeden scenariusz, choć jest on trochę naciągany. Jak wiadomo pisanie do pliku, czyli operacja I/O jest powolna i wtedy wątek/proces oddaje moc obliczeniową, bo i tak jej nie wykorzysta. Może jeden z wątków jest głodzony? Bez tego spowalniacza I/O, jeden wątek pożera całą moc obliczeniową, a drugi stoi w miejscu. Kiedy jednak dodać ten WriteFile, to zaborczy wątek siłą rzeczy musi oddać procesor i wtedy nie ma mowy o głodzeniu. Tylko, że wątki są równouprawnione i nawet przy jednym procesorze każdy powinien jakiś kwant czasu dostać. Przy dwóch prockach głodzenie jednego z wątków wydaje się absurdem, choć kto wie. Poza tym liczę skrycie, że nie o to chodzi - bo niby jak to ma być, mam bruteforce'a spowalniać? :P

Napisano

Ja natomiast podam inny scenariusz. Masz gdzieś problemy z pamięcią, jakiś buffor za mały, wewnętrzne struktury jakiejś listy nadpisane, wypisanie za/przed tablicę, albo coś w tym stylu. Tego typu błędy objawiają się dokładnie w sposób który podałeś. Przejrzyj wszystkie operacje na pointerach etc.

Napisano

Ok, błąd znaleziony. Jednak chodziło o synchronizację. To prawda, każdy wątek miał swoją pamięć. Ale nie zauważyłem, że sama procka licząca ma swoje globalne dane, które wątki współdzieliły. Dzięki Gynvael za odpowiedź :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...