Progresul hardware, episodul 23: Altă incursiune în trecutul numeric

(Eram în așteptarea lui 7980XE aici)

*
      Au mai fost zile fructuoase pentru fondul 1 numeric - pe 26 septembrie s-a trecut de la cota 23185 la 23240. Pe 29, până să moară NVME-ul, s-a ajuns la 23299, iar seara la 23300. Pe 2 octombrie, la 23320. Până la 13 septembrie erau 22849, și ele din noiembrie 2016 - anul trecut pe 2 octombrie eram la 22806 numere, iar până în ultima zi din 2015 la cota 22777, valabilă încă de la capătul anului 2014.
     
      În noiembrie 2014 mă îndoiam să mai existe numere de fond 1 până la 23000, sau chiar dincolo de prag, însă iată că a mai fost loc pentru peste cinci sute. Și cred că mai sunt. La 22777 m-am gândit chiar că or fi toate. Nu erau toate.
      Prin luna iunie din 2014 erau 22615; la capătul anului 2013 erau 22457 parcă, și 22454 la 16 mai 2013; pe la jumătatea lunii octombrie din 2012, 22103; iar în 4 februarie 2012, când am ajuns la numărul de 1907 cifre cu suma divizorilor de 11 ori el, erau 22000 și câteva zeci, poate 20 și ceva, dar nu am memorat exact valoarea.

      Pragul 22000 fusese sigur depășit atunci, foarte de curând, chiar în acea sâmbătă, cred; pentru că înglobam la greu numere multiperfecte și semiperfecte disponibile pe Internet, dintre cele mari rămase până la cel de 1907 cifre, ca să mă folosesc de ele și de numerele prime din componența lor ca puncte de plecare, pe principiul cunoscut. Dar a durat foarte mult ca să depășesc următoarea mie - și la Anul Nou 2012 nu țin minte câte numere de fond unu erau. Poate 16000 și ceva. Știu că la fondul 2 erau 13300000 și ceva, un număr de numere apropiat de o componentă de 33, și că am plecat atunci în vacanță de acasă (29 decembrie - 6 ianuarie) lăsând Veritonul să meargă ca să-mi găsească tocmai numere noi de fondul 1 (și chiar au fost câteva). După cota 22000 a durat foarte mult pentru mia următoare.
     
      Și așa în anul acela (2011) a fost un important progres de viteză faptul că am trecut de la vechiul calculator (ASRock K7VM2 R3.0 cu AMD Athlon XP 1800+ overclockabil) la Veriton; vechiul procesor era uniprocesor, chiar dacă puteam depăși 1.7 gigaherți prin overclocking, mai exact prin schimbarea BCLK-ului de la 133 în sus, factorul de multiplicare fiind constant (11.5). Coolerul pe aer nu răcea chiar foarte bine, așa că 150 * 11.5 = 1725 a fost cota maximă dincolo de care să nu mi se stingă după o vreme din cauza căldurii. Dar atunci (2010-2011) nu eram conștient că mi-ar trebui alt cooler mai performant, plus că nu știu cum era industria de coolere pe apă pe atunci și finanțele erau altfel decât în jumătatea 2 din 2017 - eram student fără bursă. Factorul 11.5 nu mi-l amintesc modificabil din BIOS, dar ceea ce se putea schimba la acel procesor AMD era ceasul (Base clock), care când se rula standard la 1533 MHZ era pus la 133 (de fapt, 133 perioadă 3 înmulțit cu 11.5 dă 1533 perioadă 3).

Valoarea minimă a ceasului era 50 (575 MHz), iar maxima, 248 (ar fi fost 2852 MHz, cu un cooler pe măsură). Despre rulare turbo nu știam, oricum nu era un procesor care să o cunoască - prima versiune de turbo pentru procesoare a fost anunțată de Intel și în noiembrie 2008 se știa ceva despre ea, iar AMD-ul a introdus mai târziu conceptul de Turbo Core, probabil în inspirație de la rivalii Intel, pe câtă vreme AMD Athlon XP 1800+ a fost lansat în octombrie 2001. De altfel, și data BIOS-ului din calculator era 2 aprilie 2001.
     
      La Veriton, în schimb, procesorul Intel Core i5-650 OEM (venit gata instalat pe placa Acer Veriton M490G în unitatea centrală) nu avea potențial de overclock, însă avea Turbo Boost versiunea 1 (cea anunțată în 2008), fiind lansat oficial în primul sfert al anului 2010. Și data BIOS-ului din Veriton este 30 decembrie 2010. Procesorul avea (are și acum, de fapt, căci încă poate să meargă) 3200 MHz frecvență de bază, având și două nuclee, și în plus, hiperthreading pe nuclee - fiecare nucleu se împărțea în alte două procesoare logice (Thread), așa că în total impresia era de patru procesoare într-unul singur. Cu partea de Turbo, dacă procesorul este pus pe jumătate la treabă (un nucleu din două), se rulează la 3466 de megaherți, iar dacă este în întregime solicitat, cele două nuclee (toate threadurile) rulează la 3333 de MHz.

Dar nu am fost de la început conștient de însemnătatea Turbo (de fapt, tocmai în 2017 am studiat-o mai mult), chiar dacă pe parcurs am intrat de mai multe ori pe pagina de Intel a lui i5-650 și vedeam că se spune de 3.46 GHz ca maxim în Turbo. BIOS-ul Veritonului nu știa, nu numai de overclocking (oricum imposibil), dar nici de Turbo (adică să fie o setare pe care s-o pun activă sau inactivă), și, nestudiind îndeaproape frecvența curentă a procesorului prin programe dedicate, cum e CPU-Z în Windows sau, între timp, i7z în Linux, dar văzând în alte puncte de sistem că este raportată în zona numărului 3200 (frecvența de bază), am crezut în toți acești ani că nu pot să rulez în Turbo pe placa mea, ci că stau la frecvența de 3200 când el lucrează, și abia în septembrie 2017 cu CPU-Z am văzut că atinge 3333 și 3466.
     
      Dar era categoric mai presus de ce putea AMD Athlon XP-ul să facă, în plus oricum megaherții Intelului sunt mai puternici în operații pe secundă decât cei de la AMD. În iulie 2011 numerele erau undeva la 2 milioane, iar nu am ținut minte câte erau pe 27 iulie, dar știu că RZ.TXT (fișierul care conținea numerele de fond 2 separate de cele de 1) avea peste 220 de MB, oricum peste 200 de MB binari, în Windows. Nu mai țin minte nici câte cifre aveau cele mai mari, dar în mod sigur numerele prime din componența tuturor numerelor erau sub 1000, pentru că tocmai în dimineața de 18 august 2011 eram la pragul miei de numere prime (884 sub 2 la puterea 32). La 4 februarie 2012 erau 5173.

Nu țin minte câte numere de fond 1 erau când am terminat cu lucrul pe calculatorul cu AMD, dar atunci și eficiența algoritmilor și a strategiei de căutare era mai ineficientă decât azi. Și saltul de memorie în 2011 a fost important - de la un singur GB de DDR simplu în frecvență 266, în iulie, la 16 GB de DDR3-1333 pe la 13 octombrie 2011. Pe atunci numerele încă erau suficient de puține încât să încapă multe odată în memorie, pe zeci de puteri de 10 consecutive la un pas. Dar dacă erau deja zece milioane de numere cu precizia MIRACL maximă peste 1000, sigur produsul era concurent cu memoria și nu puteau chiar toate odată să mai fie mult timp actualizate, deși pe atunci exista un singur mare fișier înglobator de fond 2 (mai târziu, în 2014, țineam și numerele de fond 1 alături de celelalte în fișierul mare, pentru că și despărțirea punea greutăți în eficiența algoritmică, și a existat un singur mare fișier (principal) de numere până în septembrie 2015, la dezastru).
     
      Pe calculatorul cu AMD, dată fiind micimea depozitului numeric, puteau oricum să fie actualizate toate într-un pas - dacă în mai 2011 erau un milion de numere de maxim câteva sute de cifre, se încadrau în 1 GB. Era creștere numerică și în primăvara aceea - în fapt, în luna februarie pragul abia trecea de suta de mii (fondul 2), iar în aprilie era, la un moment dat, între 400000 și 500000. Cât se poate de încadrabile într-o memorie de 1 GB, împărțită în două bancuri de câte 512 MB.

      Iar în anul 2010, chiar mai mult loc liber - până pe 4 noiembrie nici măcar nu exista un fond 2, numerele se obțineau unele din altele (înmulțiri sau împărțiri) doar pe baza câtorva mii de numere, de până în 150-160 de cifre, toate cu fracționarea abundențială maxim 10, și în plus șeptarii abia începuseră să fie incluși din 7 septembrie 2010, când am strâns primii 89 la un loc (pentru că perioadele fracțiilor de tip șeptime sunt mai grele pentru ochi, sunt câte șase cifre diferite). Depozitate într-un fișier text, numerele de până la 4 noiembrie 2010 nici măcar 1 MB nu ocupau pe disc, iar în memorie nu puteau să ocupe cu mult mai mult, așa încât nu erau o problemă pentru totalul de spațiu cu memoria.
     
      Până să descopăr pe 16 septembrie 2010 cum se țin corect într-un fișier numerele ca să poată fi corect citite în Borland C++ (cin din fișier), cu spațiere potrivită între ele (mai târziu pe rânduri diferite), le integram direct în fișiere CPP, ca să fie citite și interpretate din vectorii de acolo, și trebuia chiar să recurg la artificii de reprezentare scrisă a lor, ca să poată fi citite fără să depășesc lărgimea unei constante întregi (2147483647), adică fiecare număr mai mare de atât trebuia scris ca un produs de numere până în 2147483647 (șeptarii nu erau, sau erau separat depozitați din 7 septembrie).

Cum pe 16 septembrie erau 4013 non-șeptari (3997 mai devreme, de cu timpul nopții) de maxim 119 cifre, ei în mod normal, puși într-un fișier, s-ar fi oprit poate la 300 și ceva de KB, dar eu trebuia să le lungesc reprezentarea în vectorii CPP prin acele produse, așa că textul-sursă respectiv ajungea mai mare de atât și Borland C++ 5.5.1 refuza să compileze coduri-sursă peste 640 de KB, așa că de bună seamă (fiind din august depășită această limită la un moment dat, dacă țin bine minte) că am separat cumva o parte de alta, ca să nu fie prea multe într-un vector.

Mai cu seamă că nu erau numai ele acolo, ci și un vector de numere prime și știu că foloseam și unul de coeficienți de legătură, care putea fi foarte mare la rândul lui, ei putând fi generați dinamic prin împărțirea numerelor mai mari la cele mai mici și coborându-se prin ele, tot așa făcându-se împărțire la numerele de dedesubt. Nu foloseam o bibliotecă de generare de numere aleatorii, ca să fac la întâmplare coeficienți din diferite puteri ale numerelor prime componente (cum am făcut mai de curând cu factorii neprimi folosiți de MODIFSUM), oricum programam mai ineficient în 2010 decât în 2017.

Comentarii

Postări populare