Progresul hardware, episodul 31: Reforma PUTERNUM în acțiune (noiembrie-decembrie 2017)

Plus o introducere cu formule pentru overclockeri.

(Am căutat formulele acestea, pentru că voiam, spre sfârșitul toamnei lui 2017, să înțeleg mai bine câți wați consumă procesorul 7980XE, fiind atunci Aorusul sub overclocking la 7980XE, cu siguranță mai mulți decât dacă procesorul ar fi fost folosit la frecvențele canonice de fabricație, alias stock speeds.
În sfârșit, NU am ajuns atunci la un rezultat concludent și convingător, sigur că nici n-am avut multă răbdare să fac un jurnal de calcul al wattajului.)

*
CPU Overclocked Watts = Default Watts x ( S0 / S ) * ( V0 / V ) ^ 2.
Where,
S0 = Overclocked Processor Speed,
S = Default Processor Speed,
V0 = Overclocked Processor Vcore Voltage,
V = Default Processor Vcore Voltage.
Processor Temperature = ( C/W Value x Overclocked Wattage) + Case Temperature.
*

(Mai departe, avem un plan scris, tot preliminar, pentru ceea ce voiam să fac la reforma PUTERNUM, adică la folosirea de matrici cu vectori de puteri de factori primi, din care să culeg mai direct puterile astea prime fără să tot stau să înmulțesc și să-mpart variabile numerice care să pornească de la puterea-unitate sau de la pătratul ei.
Ca și mai vechea reprezentare algoritmică, din altă postare, cu 3, 5 și 7, nici acest plan nu a coincis cu ce am ajuns să implementez efectiv ulterior, dar măcar căutam să îmi ordonez ideile și să fac un plan scris, răbdător, de acțiune.

De altfel, de pildă NU am mai tratat preferențial, separat, factorii primi 3, 5 și 7, cum făcusem mult timp până la ultima parte a lui 2017 - ci i-am reintegrat laolaltă cu restul primelor impare, 2 rămânând cu tratament special, cu shiftări pe biți... în calitatea lui de unic număr prim par. La începutul sistematizării numerelor prime din componența numerelor mari de căutare, 3, 5 și 7 stătuseră tot normal, în vector... pardon, în rând cu lumea, iar procedeul de a le trata separat - cu shiftări pe biți la 3 și 5,, de exemplu, în calitatea lor de numere imediat mai mari cu 1 decât niște puteri de 2 - a fost gândit între timp, ca apoi să fie și el lăsat deoparte când am găsit ceva și mai bun, în speță pe PUTERNUM. Și-atunci, să vedem mai departe cum era gândită noua strategie numerică în noiembrie 2017.)

**
Pentru PUTERNUM: trei vectori separați pentru 3, 5 și 7, cu puteri de numere prime, iar când 3, 5 și 7 sunt de tipul K (pot puterile lor să depășească 2^64), chiar șase vectori, câte doi pentru fiecare număr prim, anume unul de gmp_ui, cu puterile sub 2^64, și unul de mpz_t, cu restul de puteri, până la maximul indicat în fișierul de PUTERI corespunzător CF-ului implicat (de exemplu PUTERITOT.TXT pentru numerele dintre 10^420 și 10^1910).

În fapt, pentru 3, 5 și 7, aș putea chiar face câte un singur vector, nu un triplet, numai că de fiecare dată ar trebui reîncărcat cu puteri, când se trece de la 3 la 5 și apoi la 7, așa că mai bine câte trei, preîncărcați cu valorile la începutul programului (înainte de începerea parcurgerii depozitului numeric).

Pentru situațiile de K - 3 (SCOTFACT), când din cei H factori primi de componență există K factori cu puteri ce trec de 2^64: două matrici de puteri de factori primi, una cu K vectori de tip gmp_ui, pentru acele puteri sub 2^64 ale celor K numere prime de componență, și una cu alți K vectori de tip mpz_t pentru puterile factorilor primi, cum trebuiesc încărcate și puterile de primi care sunt peste 2^64.

Mai simplist, poate fi o singură matrice cu K vectori care să prindă toți indicii puterilor de factori primi până la maximele scrise în fișierul de PUTERI, dar atunci totul va fi mpz_t.

Când chiar și în zona numerelor cu factori primi K, unele numere pot avea acei factori primi din componență în puteri care să nu treacă de 2^64, și pentru rapiditate le-ar sta bine folosirea de gmp_ui în loc de mpz_t.

La trecerea prin numerele prime, la fiecare factor se poate evita parcurgerea directă a matricii la poziție prin atribuirea unui vector auxiliar cu poziția aceea, unde intră puterile pregenerate ale acelui factor prim. Dar atunci vectorul auxiliar trebuie și el declarat în plus, în variabilele programului. El trebuie să fie unul singur din capul locului, dat ca parametru la sumare, dar și procesul de atribuire a lui din matrice cere un timp de execuție. Funcția de sumare trebuie să aibă mulți parametri.

În fapt, în varianta de K - 3 cu două matrici, gmp_ui și mpz_t, trebuiesc doi astfel de vectori auxiliari, iar cel mepezetea cere și mai mult timp să fie atribuit din matricea sa, la poziția sa. Atunci ar trebui să rămân cu parcurgerea directă a matricii, sau matricilor, când ele sunt două. Dacă nu putem lua în C conținutul unei poziții a unei matrici, într-un vector, zicând simplu b = a[i],unde b este vectorul și a[i] al i-lea vector prins de matricea a.

Dar poate că la gmp_ui se poate zice așa. Însă la mpz_t mă gândesc că sigur nu avem cum să atribuim așa un vector cu alt vector. Trebuie cercetat.

Legat de posibilitățile de mai sus cu matricizare și vectorizare, în K, inclusiv cu 3, 5 și 7, pot chiar să fac mai multe funcții la rând, de încercare, unde să cuprind toate aceste variante.

În zona de H fără K, factorii primi au puteri fără depășire de 2^64, așa că la ei merge o matrice de H-K vectori de tip gmp_ui.
Dimensiunile tuturor acestor vectori ai matricilor trebuie să se încadreze față de maximele de puteri din fișierul corespunzător de puteri.

Matricile au două dimensiuni, prima cu numărul de vectori (egal cu numărul de numere prime K - minus trei, SCOTFACT - sau H-K), iar a doua cu maximul posibil de putere din fișierul de PUTERI pentru zona respectivă de K sau H-K, de pildă în PUTERI1910.TXT (care are puterile cele mai mari) factorii primi K scotfactizați încep de la 11, care are și cea mai mare putere dintre ei, anume 40, și atunci K vectori de câte 40 de elemente când CF1910 (de fapt, P2 ori PRIME2) este implicat. Pentru H-K, tot aici la PUTERI1910, exponentul maxim de putere din fișier ar putea fi 10, trebuie să mă conving, sau poate 8, adică H-K vectori de 8 sau 10 elemente. Dimensiunile matricii, când sunt declarate, trebuie să fie fixe.

Dar dacă aleg varianta dualismului matricial la K, cu matricea de gmp_ui și cea de mpz_t, unde se mărește condiționalitatea de la sumare, atunci prima dimensiune se păstrează, dar a doua se împarte între matrici, și anume se ține cont tot de exponentul cel mai mare de putere din zona de K scotfactizat, anume 40 al lui 11, din care se sustrage 18 pentru matricea de gmp_ui, pentru că 11 la puterea 18 este mai mic decât 2^64, iar 11^19 este deja mai mare.

Ceilalți factori primi peste 11 au nevoie de puteri mai mici de 18 ca să iasă din zona de mpz_t, însă dacă matricea k-scotfactizată de tip gmp_ui are K (-3) vectori de câte 18 elemente la PUTERI1910, pentru matricea mpz_t dimensiunea 40-18=22 pentru vectori nu este suficientă, ci este doar minimă, adică aici trebuie ținut cont și de exponentul minim de putere din zona K-scotfactizată și se prea poate ca, pentru acoperire, dimensiunea de aici a vectorilor să fie (măcar aproape de) 40. Dacă exponentul minim K-scotfactizat din PUTERI1910.TXT este 3, atunci la dualismul matricial dimensiunea pentru vectori a matricii-mepezetea va trebui să fie 40-3=37, nu 40-18=22. Mai simplu de dimensionat dacă este o singură matrice, cea mpz_t. Mă gândesc la viteza mai mică pentru numerele care totuși nu trec de cadrul gmp_ui în zona scotfactizată (și chiar la 3, 5 și 7), dar și spargerea în două matrici are propriile complicații.

La fișierele de puteri de sub PUTERI1910 sunt puteri mai mici la exponent și valoare, iar K, mai mic sau nul.

Dimensiunile matricilor și vectorilor pot fi date dinamic, în funcție de intervalul de căutare, dintr-un fișier declanșator care să scrie dimensiunile într-un header și care să pornească rularea lui PUTERNUM, după modelul cu LITUAN.h de la ERMETE, VARONTE și PARONTE, și atunci și limitele intervalului de căutare (jos și sus) pot fi date prin argv către PUTERNUM.
Și PUTERNUM poate fi erbigenizat în felul lui.

Pentru numerele prime de componență numerică aflate în afara lui H, PUTERNUM nu aduce ceva specific, ele fiind în putere unică și construirea sumei divizorilor numărului putându-se face cu ele la fel ca la zonele echivalente din celelalte sumatoare - cum sunt SUMADIV, NUMSUM, SUM, SM.
Specificul lui PUTERNUM este în cum se tratează construirea sumei atunci când se parcurg factorii primi multiputere (H).

Și încărcarea cu puteri de factori primi a vectorilor și matricilor se poate face la începutul rulării lui PUTERNUM, totul trebuind să fie deja încărcat înainte de pornirea parcurgerii depozitului numeric ales (GIG ori LPTUAN). Se pot și scrie în măcar un fișier aceste puteri, ca să fie citite de acolo la încărcare, nu de fiecare dată calculate în memorie. Dar la parcurgerea numerică tablourile acestea (vectori și matrici de puteri prime) trebuie să fie sigur deja gata, fără consumat timp pe generarea lor, și să fie pe dată citite.

Puterile scrise în tablouri vor fi probabil crescător ordonate, valoarea minimă fiind chiar numărul prim, nu puterea a doua a lui (se poate ca un număr dat din depozit să se împartă doar o singură dată la acel factor prim). Prin cursarea în vectorul de puteri, se verifică dacă numărul se divide cu puterea, iar când divizibilitatea încetează, se face înmulțirea sumei.

La 28 decembrie 2017 am distrus vechiul pachet de algoritmi care nu avea PUTERNUM.

*
PS Am mai luat un hard disk de 4 TB în luna asta din 2017, iar când mergeam cu el seara spre casă mă gândeam la numele compozitorului italian Giovanni Maria Trabaci.

Comentarii

Postări populare