W przypadku kart Tahiti mamy pełną elastyczność modyfikacji. Punktem wyjścia jest tutaj 250 sol/s dla 7950 i 270 sol/s dla 7970 w algorytmie Equihash. Podstawowym parametrem do optymalizacji jest tutaj zużycie energii, które domyślnie osiąga okolice 200 W i aby zminimalizować koszty działania, należy obniżyć tę wartość do poziomu 120 – 130 W. Potrzebujemy obniżyć TDP i napięcie rdzenia przy zachowaniu wydajności, i aby to uzyskać, musimy uzbroić się w następujące narzędzia:
- Jako edytor BIOS-ów wykorzystamy VBE (vBIOS Editor) w wersji 7, który można pobrać z techpowerup.com – pozwoli nam to na zmianę zegarów, TDP oraz przeliczenie sumy kontrolnej BIOS-u
- W przypadku kart z pamięciami Hynixa możemy pójść na skróty i zastosować Tahiti Memory Patch, który jest przygotowany z myślą o pamięciach tego producenta. W innych przypadkach potrzebujemy zastosować edytor dyskowy (heksadecymalny), np. HexEdit.
- Oprócz tego będą nam potrzebne standardowe narzędzia, takie jak GPU-Z, MSI Afterburner i ATiFlash
Potrzebujemy obniżyć TDP i napięcie rdzenia przy zachowaniu wydajności
Dodatkowo karty te cierpią na przypadłość związaną z OC pamięci – podniesienie zegarów o 1 MHz ponad stock (1250 -> 1251 w przypadku 7950/280 lub 1500 -> 1501 w przypadku 7970/280X) powoduje spadek wydajności o ok. 8 – 10%. Rozwiązaniem jest modyfikacja strapów, która w przypadku Tahiti jest prosta – nadpisujemy timingi w BIOS-ie w wyższych strapach kopią z niższych, np. z 1125 MHz. Na początek jednak zajmijmy się ograniczeniem zużycia prądu. W tym celu potrzebujemy zmienić napięcie rdzenia GPU przypisane do stanu performance 3D oraz trybu Boost, jeśli taki występuje, jak również obniżyć wielkość TDP. Możemy też zmienić od razu domyślne zegary, jeśli oczywiście znamy docelowe wartości – przestawianie ich na ślepo mija się z celem, bo może spowodować wyłącznie problemy ze stabilną pracą.
Otwieramy VBE7 i ładujemy do niego BIOS:
Pierwsza strona pokazuje podsumowanie – ten BIOS pochodzi z HD7950 firmy Sapphire, model Dual-X z Boost. Na zakładce PowerPlay mamy właściwe zegary i napięcia, faktycznie w stanie Performance mamy 4 ustawienia – 2d, low 3d, full 3d i Boost:
Możemy postąpić dwojako – możemy kompletnie wyłączyć Boost lub polegać na układach sterujących GPU, że dobiorą nam odpowiedni stan karty. Osobiście polecam pierwsze rozwiązanie, które osiąga się przez wpisanie tych samych wartości dla stanu #3 i #0. Ponadto VDDC na poziomie 1256 (=1.25V) to zdecydowanie za dużo i zmienimy to na coś zdecydowanie przyjaźniejszego, czyli 1031 (=1.03V). W ten sposób pod obciążeniem napięcie rdzenia będzie w okolicy 1V. Przy okazji wiem, że moja karta działa na 950 MHz, więc od razu mogę sobie to zmienić. Poniżej ustawienia:
Następnie przechodzę na zakładkę OverDrive & PowerTune, gdzie mam do wyboru niewiele opcji:
W OverDrive interesuje mnie tak naprawdę max.memory clock i TDP limit. To pierwsze ustawienie pozwoli mi podnieść limit, do którego mogę podkręcić pamięć – co prawda na 7950-kach rzadko zdarza się przekroczyć 1500, ale na wszelki wypadek można ustawić 1750. TDP limit z kolei pozwoli na rozszerzenie zakresu limitu zużycia energii przez kartę – jeśli dam tu 50%, to będę mógł użyć tego zakresu w sterowniku i obniżyć pobór mocy. Na koniec jest ustawienie TDP – jak widać domyślnie karta ma je ustawione na 203 W, a skoro to dla mnie za dużo, to na początek obniżę to do 180 W.
Zapisuję taki BIOS pod nową nazwą 7950_950_1250_1031_tdp180.rom. Dzięki temu wiem z samej nazwy, jakich modyfikacji dokonałem i czego mogę się spodziewać. Przy okazji wspomnę, że to jest bazowy zestaw modyfikacji – w kolejnych krokach należy stopniowo obniżać TDP i VDDC, testując po każdej zmianie stabilność. Tak przygotowany BIOS należy teraz wgrać do karty i po restarcie potestować.
Timingi
W kolejnym kroku edytujemy timingi dla karty przy użyciu HexEdita. Otwieramy edytor i wczytujemy do niego nasz BIOS:
Teraz potrzebujemy odszukać strapy w naszym BIOS-ie. Odszukujemy 48 E8 01 (pamiętacie z poprzedniej strony dlaczego? bo to jest zakodowane 1250) i przy odrobinie szczęścia strapy powinny się odnaleźć. Domyślny layout programu jest nieco za wąski, dobrze jest go sobie trochę rozszerzyć i zmienić grupowanie cyfr szesnastkowych następująco:
- Szerokość ekranu na 52 znaki (ostatnia kolumna będzie miała tytuł 33 szesnastkowo) – poprzez złapanie i przesunięcie w prawo małego trójkącika w nagłówku pomiędzy panelem szesnastkowym a znakowym
W tym momencie już wiem, że znalazłem tablicę strapów – z góry na dół obok siebie mam ciągi podobnych liczb, które różnią się nieznacznie w kilku miejscach. Gdyby pierwsze wyszukanie 48 E8 01 nie dało takiego rezultatu, trzeba szukać dalej do skutku podobnego do powyższego.
- Offset regulujemy przez złapanie i przesunięcie małego trójkącika w nagłówku po lewej – ustawiamy go tak, aby odnaleziony przez nas ciąg znaków zaczynał się po lewej stronie
- Na koniec grupowanie – łapiemy tabulator z nagłówka znajdujący się między kolumnami 03 i 04, i przesuwamy go maksymalnie w prawo
Teraz możemy przystąpić do modyfikacji. Jeśli ktoś z Czytelników edytował kiedyś save’y do gier, to w tym momencie czuje się najprawdopodobniej znajomo. Wracając do modyfikacji – przypomnę pokrótce podstawy:
- Strap – 52 bajty (stąd taka szerokość ekranu): 3 na częstotliwość, 1 na typ pamięci, 48 na zakodowane timingi
- Częstotliwość kodowana little-endian: 1250 ma postać 48 E8 01, 1125 = 74 B7 01, a 1000 = A0 86 01
- Typ pamięci – 01 = Hynix, 02 = Elpida.
Z powyższego screena wynika, że tablica strapów ma podwójne wpisy, jedne dla Hynixów, drugiego dla Elpid (przy okazji potwierdza to pierwsza zakładka z VBE). Jest to istotne, żeby nie pomieszać timingów pomiędzy nimi, bo karta wtedy nie wstanie albo nie będzie stabilna pod obciążeniem. Wcześniej w GPU-Z zidentyfikowałem, że karta ma pamięci Hynixa, będziemy się więc poruszać tylko w obrębie tych strapów z 01 na czwartym bajcie:
A sama modyfikacja, jak wcześniej napisałem, polega na skopiowaniu timingów z niższego (ostrzejszego) strapu do wyższych częstotliwości. Zacznijmy od strapu 1125 – zaczynającego się od 74 B7 01:
- Wybieramy z niego timingi:
- Kopiujemy (Ctrl+C) i przechodzimy jeden wiersz w dół (do strapu 1250)
- Wklejamy (Ctrl+V). Edytor krzyknie, że jesteśmy w trybie read-only i czy chcemy przejść do edycji – kwitujemy uśmiechem to pytanie klikając OK. Pojawia się drugie pytanie – „do you want to turn on insert mode?”. Otóż, mój drogi padawanie, nie, a to dlatego, że insert mode spowoduje zmianę rozmiaru naszego pliku, czego za żadne skarby nie chcemy. Chcemy nadpisać istniejącą zawartość, wybieramy No.
- Oto efekt – timingi ze strapu 1125 wylądowały w 1250.
- Potrzebujemy to teraz powtórzyć dla pozostałych wyższych strapów dla typu 01 (nie znalazłem niestety, jak wyłączyć to pytanie o insert mode - gdyby ktoś to odkrył, proszę o info w komentarzu):
- To już prawie koniec – w ostatnim kroku zapisujemy tak zmodyfikowany BIOS pod nową nazwą (ja go nazwę 7950_950_1250_1031_tdp180_strap1125.rom), natomiast nie nadaje się on teraz do użytku, bo nie zgadza się jego suma kontrolna. Rozwiązaniem jest zamknięcie pliku w HexEdicie, ponowne otwarcie go w VBE (który przy otwarciu krzyknie na nas „Invalid checksum”) i zapisanie go pod tą samą nazwą. Teraz BIOS nadaje się już do flashowania i przetestowania.
Tak spreparowaną kartę czeka jeszcze test na okoliczność OC pamięci, które w tym przypadku osiągnęły maksimum przy 1360 MHz. Wydajność w stosunku do stockowych wartości skoczyła o ponad 10% przy jednoczesnym obniżeniu poboru prądu z gniazdka z 230 na 175 W, przy czym 50-55 W pobiera sama platforma, zatem karta zeszła ze 175 na 120 W. Taką kartę można już spokojnie wysłać do pracy w kopalni.
Pokaż / Dodaj komentarze do: Mining kryptowalut - część 3/4 - optymalizacja