Revelația din 3 aprilie 2019

Miercurea trecută am realizat ceva ce nu băgasem în seamă cum trebuie, înainte, despre plăcile video moderne și CUDA.

Am aflat de la cineva cu care am fost coleg la facultate cum timpul de execuție al algoritmului de factorizare pentru un număr de 110 cifre a scăzut de la 38 de ore la două ore și jumătate după ce a fost rerulat cu CUDA pe o placă video, asta față de cum mersese pe procesor.

(https://www.mersenneforum.org/showthread.php?t=18549&fbclid=IwAR18RPmIgPpfWRBncBMq1JJokDL_wMdaAJyBwv6rTM3rgyTM6VGhjOKGTC0)

Dar, ce-i drept, nici procesorul nu era un Threadripper 2990WX, nici placa video o NVIDIA RTX 2080 TI. Este o postare pe un forum undeva în toamna anului 2013, când oricum nici GMP-ul nu avea ultima versiune. Iar Shakuntala Devi (femeia-calculator biologic) nu mai era în viață.

CUDA este o suită de funcții de programare, care funcții sunt bazate pe limbajul C, pentru paralelizare (de pildă la adunări de elemente de vectori sau la operații cu matrici), numai că paralelizarea asta se face pe procesoarele plăcii video, nu ca la OMP cu paralelizare pe thread-urile procesorului central de pe placa de bază. Iar pe video numărul de procesoare, mai ales astăzi, este MULT MAI MARE.

Mai auzisem de cu timp ceva despre calcule cu numere pe plăci video Tesla, dar am considerat că acele plăci nu sunt accesibile publicului larg și că tot cu procesoarele clasice este bine de mers pentru povestea mea cu numerele. Mai că era și de mirare ideea să faci numere pe o... placă video.
Dar în ultima săptămână realizez că, într-adevăr, potențialul procesoristic hardware al unei plăci video poate fi ceva de-a dreptul BESTIAL față de procesoarele obișnuite, asta desigur dacă există și funcțiile aritmetice necesare pentru ceea ce-mi trebuie la numere, în ce privește strict numerele de-acasă.

Un Threadripper 2990WX are 64 de procesoare virtuale (32 de nuclee cu multithreading de 2 pe nucleu), și ele pot să ruleze la 4.1 GHz fiecare, iar o placă video NVIDIA RTX 2080 TI are 4352 de procesoare de tip CUDA, care pot să meargă la vreo 1.6 GHz (plus că și substanța unui procesor video diferă ca alcătuire față de cea a unui procesor obișnuit, nu știu dacă într-un sens mai rapid, dar chiar și numai făcând produsul cu regula de trei între frecvențele și inimile RTX-ului față de Threadripper, fără să luăm în calcul și diferențele fizico-chimice de arhitectură, și deja ajungem la un avantaj procesoristic uriaș al plăcii video).

Avem 64 * 68 = 4352, și chiar dacă 4.1 împărțit la 1.6 dă vreo 2.50 și ceva, produsul 4352 * 1635 (să zicem, pentru versiunea maximă Founders Edition a plăcii, 1545 fiind frecvența versiunii celeilalte) tot este de vreo 27 de ori mai mare decât 64 * 4100.
1350 MHz este frecvența de bază a procesoarelor de la 2080 TI, restul fiind detalii de overclocking video (da, și acolo se poate așa ceva).

Ca să folosesc în 2019 o astfel de placă pentru numere, trebuie să adun cu răbdare și să fie și o îmbunătățire în cariera de programator, cu serviciul.
Și poate oi mai câștiga ceva prin lucrul cu calculatoarele și cu cifrele - dacă tot am pus atâta suflet în ele în viața asta.

Și desigur, să învăț CUDA și aritmetică de precizie arbitrară pentru CUDA.

Iar placa aceea video, 2080 TI, mai are și altfel de nuclee: 544 de „Tensor cores” și 68 de RT cores (8 * 68 = 544). Este GDDR6 (a apărut și versiunea șase de GDDR la video), are 11 GB de memorie cu frecvența de 14 gigaherți și 1750 MHz la bază (și 1750 * 8 = 14000), are nevoie de doi conectori de putere de câte 8 pini (PCI-E 6+2, pesemne) și, ca grosime, este dual-slot (bine că nu e tri-slot), ceea ce înseamnă că o să acopere din oficiu două porturi de PCI-E pe placa de bază - chiar dacă de înfipt se înfige într-unul singur, totuși la ce groasă este o astfel de placă pe transversală, sigur că îl acoperă și pe celălalt. Dar barem nu răpește două în plus.

„Tensor cores” sunt folosite pentru rapidizarea mare a calculelor cu numere cu virgulă mobilă (alea neîntregi) pe placa video.

Iar celelalte, așa-zisele RT cores, țin de arhitectura de tip Turing a plăcii video și au legătură cu capacitățile de redare video pe care le are o 2080 TI - în engleză, sunt concepte precum „hybrid rendering” și „real-time raytracing”.

******************
Dar pentru ideile de calcul cu numerele, cu execuție de multe programe pe multe procesoare în paralel, trebuie să ne concentrăm pe CUDA și pe funcțiile aritmetice adiacente.

Deocamdată, din ce am căutat până acum despre programarea aritmetică pe CUDA, au fost lansate de-a lungul timpului unele biblioteci mai mult sau mai puțin dotate cu funcții aritmetice, precum CAMPARY, CUMP, GPUPREC (asta este făcută din alte două, GQD și GARPREC, care la rândul lor exportă către placa video funcții de precizie aritmetică extinsă de la bibliotecile de procesor obișnuit numite QD și ARPREC) și desigur și altele, însă sunt și deficiențe funcționale prin aceste biblioteci, în cazul când s-ar dori aplicarea concretă a vreuneia asupra numerelor mele - de pildă CUMP are erori în codul-sursă și funcții relativ puține de aritmetică, dedicate numerelor neîntregi (mpf_t s-ar numi la GMP), iar la CAMPARY sunt tot extinderi de numere de tip double, până la „de opt ori double”, adică maxim numere de 120 și ceva de cifre (bune și astea, mai ales că aș avea ceva nedescoperit prin zona lor) și TOT neîntregi, și doar se știe că operațiile pe întregi sunt mai rapide decât cele pe virgulă mobilă.

Nici GPUPREC nu este cu tip de date dedicat anume întregilor cu mai mult de 15-20 de cifre, ci se oferă tot numerelor reale (cu virgulă) și se bazează pe double. Atenție, NU long double.
Are tipul de date gqd_real, care însă NU este mai mult decât un... quad-double, ceva care de la 60 și ceva de cifre în sus nu mai este viabil.

Desigur, aș mai avea cercetări numerice de făcut în zona de până la 60-120 de cifre, unde de altfel câmpul de noutăți s-a tot îngustat până spre zero absolut (de pildă, la AORUS am mai găsit două numere noi în zona de 106-108 cifre, dar pe acolo deja începeau marginalele venite din împărțiri ale numerelor de mai sus, de pe THREADRIPPER, de la 111 cifre în sus - iar mai jos de 106, tot nimic).

Dar să fie la dispoziție măcar o placă video competentă pentru CUDA (chiar și numai cu 768 de procesoare CUDA, cum este o GT 1050 TI OC Windforce) pe zona asta, și de preferat să reușesc anul ăsta cu o 2080 dintr-aceea, plus să învăț suficient de bine CUDA și să folosesc cu succes tipul numeric de precizie extinsă (arbitrară) al unei biblioteci dedicate numerelor mari pe CUDA, fie ele și de tip „real”, dacă nu întreg ca mpz_t-ul de la GMP care se folosește pentru procesoarele obișnuite.

Prin august, probabil, s-ar lansa și Threadripperele următoare, poate cu 128 de thread-uri, dar ele nu mai sunt o prioritate acum.
Este nevoie să câștig mai mult, financiar vorbind, iar dacă energia mai multă pentru numere este la placa video și nu la procesor, oricum n-ar avea rost să mai plănuiesc vreun procesor nou anul ăsta (pe lângă considerentul că ar fi tot pe DDR4 și de DDR4 sunt sătul).

Astfel că acum, pentru următoarele eventuale progrese hardware, placa video foarte puternică este dorită - și este ceva mai ieftină decât un 7980XE sau decât un Threadripper 2990WX, ar putea fi pe la 6000 de lei sau chiar mai jos, pe când procesoarele de căpătâi pentru calculatoarele Desktop frizează zecea de mii de lei, iar gigantul acela nou de la Intel, Xeonul W-3175X, cu 56 de fire și 28 de inimi, cred c-ar fi vreo 20000 de lei. Și cu 192 de GB de DDR4 suport pe ditamai placa de bază ASUS ROG DOMINUS EXTREME, cu 32 de pini EPS. Sună uriaș, dar la urmă NU mă interesează asta.

Video și CUDA, și între timp continuarea luptei pentru numere cu resursele actuale.

Comentarii

Postări populare