Reverend Napisano Sierpień 5, 2008 Zgłoś Udostępnij Napisano Sierpień 5, 2008 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 Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
10tysPelikanow Napisano Sierpień 5, 2008 Zgłoś Udostępnij Napisano Sierpień 5, 2008 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Reverend Napisano Sierpień 5, 2008 Autor Zgłoś Udostępnij Napisano Sierpień 5, 2008 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ź :) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.