Reverend Napisano Sierpień 5, 2008 Zgłoś 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
10tysPelikanow Napisano Sierpień 5, 2008 Zgłoś 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
Reverend Napisano Sierpień 5, 2008 Autor Zgłoś 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
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.