U svrhu testiranja performansi BLAS biblioteke korišten je računar ASUS ROG Strix sa Intel-ovim i7 procesorom. Testirane su 3 različite biblioteke i to: 

  • MKL - prvenstveno jer je pisana za Intel arhitekture procesora, 

  • OpenBLAS - iz razloga jer se kroz istraživanje na webu izdvojila kao najbolja i najčešće korištena biblioteka iz grupe optimizovanih nekomercijalnih realizacija, 

  • Reference BLAS - osnovna naivna realizacija, implementirana više sa aspekta funkcionalnosti, nego brzine izvršavanja.  

Za testiranje performansi pomenutih biblioteka korišteni su Python i C programski jezici. Performanse su testirane na 5 karakterističnih primjera iz oblasti linearne algebre, i to:  

  • Množenje matrica, 

  • Skalarni proizvod vektora, 

  • SVD dekompozicija matrice, 

  • Cholesky faktorizacija, 

  • EVD dekompozicija matrice. 

Python 

Biblioteka korištena u okviru programskog jezika Python je Numpy. Ona  predstavlja osnovnu biblioteku u okviru Python-a za numerička izračunavanja, i u potpunosti je bazirana na BLAS realizaciji [10]. Pri instalaciji Numpy biblioteke korišteni su pip i conda alati, kao što je definisano u Numpy dokumentaciji [11]. Jedan od osnovnih razloga korištenja oba alata leži u činjenici da se u zavisnosti od njihovog izbora dobijaju Numpy realizacije sa različitim verzijama BLAS backend-a. Tako se korištenjem pip alata dobija Numpy biblioteka bazirana na OpenBLAS realizaciji BLAS-a, dok se u slučaju korištenja conda alata kao BLAS backend dobija MKL biblioteka.  

Odgovarajuću realizaciju BLAS biblioteke bi trebalo biti moguće očitati i iz konfiguracionog fajla za Numpy u okviru Python-a pozivom funkcije numpy.show_config(). Ova funkcija ispisuje informacije o bibliotekama korištenim u procesu instalacije Numpy biblioteke. Jedan od mogućih ispisa posle poziva ove funkcije je prikazan na Slici 1.  

Slika 1. Prikaz numpy.show_config informacija za Numpy sa MKL backend-om  

Međutim, takođe je važno napomenuti da ovaj ispis nekada može da prikazuje i pogrešne postavke, tako da ga obično treba uzimati sa rezervom u slučaju da se Numpy ne instalira kroz standardan conda kanal. Npr. primjećeno je da kada se Numpy instalira kroz određene conda-forge kanale, iako bi se u nekim slučajevima kao backend trebala dobiti “dummy” verzija BLAS-a (Reference BLAS) što je prikazano i u konfiguracionom fajlu, dobijeni rezultati drastično odstupaju u odnosu na “očekivane” (analizirajući forume došao sam do zaključka da stanje config varijable i nije toliko relevantno, jer postoji veliki broj slučajeva gdje su ljudi, kompajlirajući Numpy na osnovu izvornog koda dobijali drugačiju konfiguraciju u odnosu na onu podešenu u site.cfg fajlu korištenom pri instalaciji).  

Osnovni dijelovi koda korištenog pri testiranju u Python-u su prikazani na Slici 2., dok su dobijeni rezultati prikazani u Tabeli 1. U tabeli su takođe prikazani i rezultati prikazani u [12], koji su iskorišteni kao uzor za pisanje ovog testa, kao i tačne dimenzije matrica i vektora korištenih u testovima. Napomenimo samo da su dobijena vremena izračunata usrednjavanjem na većem broju iteracija. 

Slika 2. Glavni dio Python koda za svaki od 5 korištenih primjera  

Tabela 1. Prikaz dobijenih rezultata 

Iz rezultata vidimo da se najbolje performanse u oba slučaja postižu primjenom MKL biblioteke. Razlog vjerovatno leži u činjenici da su testiranja u oba slučaja provedena na Intel-ovim procesorima, tako da su dobijeni rezultati i očekivani. Vidne razlike među rezultatima prikazanim ovdje i u radu [12] potiču prvenstveno iz činjenice da su u testovima korištene različite vrste procesora (u [12] se navodi da je korišten i5 procesor).  

Pozitivna stvar ovih testova leži u činjenici da su performanse ostvarene primjenom open-source biblioteke OpenBLAS, iako inferiornije, ipak istog reda veličine sa performansama ostvarenim korištenjem optimizovane realizacije.  

Još jedan zanimljiv link na kom se mogu pronaći rezultati poređenja performansi OpenBLAS biblioteke, na karakterističnim primjerima, ali sada sa Cuda bibliotekom je dat u [13]. 

C test 

U svrhu testiranja performansi Reference BLAS biblioteke korišten je C programski jezik. Za prva dva testna zadatka (množenje matrica i računanje skalarnog proizvoda) korištena je CBLAS biblioteka, dok je za preostala 3 zadatka korištena biblioteka LAPACKE. LAPACKE predstavlja C wrapper oko LAPACK biblioteke, tj. ono što je CBLAS za Reference BLAS, to je LAPACKE za LAPACK.  

LAPACK biblioteka predstavlja nadogradnju Reference BLAS-a koja je u potpunosti bazirana na njoj. Za razliku od BLAS-a u kom su realizovane elementarne matematičke operacije nad skalarima, vektorima i matricama, LAPACK implementira kompleksnije algoritme iz linearne algebre kao što su QR ili LU faktorizacija, SVD ili EVD i slično. Napisana je u programskom paketu Fortran90, i dostupna je na [8]. 

Osnovni dijelovi koda korišteni pri testiranju (pozivi CBLAS i LAPACKE funkcija) su prikazani na Slici 3., dok su dobijeni rezultati prikazani u Tabeli 2. Pošto za računanje određenih zadataka postoji veći broj funkcija, prikazani su rezultati dobijeni za svaku funkciju. Takođe, za množenje vektora i matrica je implementirana i “naivna” realizacija korištenjem odgovarajućeg broja for petlji, kako bi se vidjele loše performanse ove realizacije čak i u odnosu na Reference BLAS. 

Slika 3. Glavni dio C koda za svaki od 5 korištenih primjera 

Tabela 2. Prikaz dobijenih rezultata 

Parametri korišteni kao argumenti funkcija su isti kao oni opisani u [5], za svaku korištenu funkciju. Važno je napomenuti da je samo prvi parametar drugačiji, i nije definisan u LAPACK standardu, ali je potreban za LAPACKE i CBLAS. On govori o načinu čuvanja (prikaza) matrice u memoriji. Pošto se matrica prosleđuje funkcijama kao niz brojeva, ovaj parametar govori o tome da li je niz kreiran upisivanjem matrice po vrstama ili kolonama. Ove konstante su definisane u lapacke.h i cblas.h fajlovima. Shodno izboru ovog parametra, mora se voditi računa i pri definisanju LDx parametara (x se odnosi na naziv matrice i najčešće je A, B ili C) u argumentima funkcija. Npr., u slučaju da se prvi parametar definiše kao LAPACK_ROW_MAJOR ili CblasRowMajor, tada se podrazumijeva da je matrica upisana u niz red po red, te se shodno tome LDx parametri definišu kao broj kolona matrice, dok se u slučaju  LAPACK_COL_MAJOR ili CblasColMajor izbora, parametri LDx definišu kao broj vrsta matrice. 

Zaključak 

BLAS biblioteka danas predstavlja standard za pisanje programa za izvršavanje elementarnih operacija linearne algebre.  Zahvaljujući standardu, mnoge high-level biblioteke su bazirane na funkcijama iz ovog standarda, a neke od najpoznatijih su Numpy, Matlab, Octave i druge. Ideja leži u činjenici da se u svrhu pisanja high-level biblioteka definišu načini korištenja elementarnih funkcija, a da se sama realizacija tih funkcija prepusti nekom drugom, tj. da te dvije realizacije budu gotovo nezavisne. Na ovaj način se dobija modularniji kod koji se gotovo bez izmjena može izvršavati veoma brzo na različitim platformama. 

BLAS kao standard je postao zanimljiv gotovo svim proizvođačima hardverskih komponenti, tako da se razvojem samih hardverskih platformi, paralelno nadograđuju i softverske komponente, kako bi se one što optimalnije izvršavale na pomenutom hardveru, te kako bi maksimalno iskoristile njegove resurse. Iz tog razloga gotovo svaki veći proizvođač čipova ima i svoju verziju BLAS biblioteke, koja je optimizovana za izvršavanje na njihovim čipovima. Tako npr. Intel razvija MKL, Apple Accelerate, ARM ARMPL itd... 

Takođe, postoji i veoma veliki broj open-source BLAS realizacija na kojim radi velika grupa ljudi i koje sadrže generalno optimizovan kod (kod koga se u procesu kompajliranja mogu definisati parametri hardvera, kako bi se dobio što optimalniji kod, ili koji u procesu kompajliranja mogu detektovati parametre arhitekture, i na osnovu toga vrše optimizaciju), a neke čak posjeduju performanse uporedive sa onim specijalizovanim za konkretne arhitekture, što pokazuju i rezultati dobijeni u sklopu testova prikazanih i u ovom radu. Neke od najpoznatijih open-source BLAS realizacija su OpenBLAS i ATLAS. 

Na kraju ćemo zaključiti da se u svrhu pisanja programa baziranih na BLAS standardu, prvo ispita mogućnost primjene specijalizovanih realizacija za konkretnu arhitekturu (njihova dostupnost, mogućnosti, cijena i sl.), kao sto su MKL i druge. U slučaju da iz bilo kog razloga to nije opcija, drugi korak bi bio da se ispita mogućnost korištenja open-source biblioteka kao što su OpenBLAS, BLIS, ATLAS i druge. Na samom kraju, u slučaju da sve do sada pomenute opcije ne funkcionišu, predlaže se korištenje Reference BLAS/LAPACK biblioteke, ali se u tom slučaju ne trebaju očekivati visoke performanse izvršavanja. Gotovo nikad nije preporučljivo pisati odgovarajuće funkcije samostalno. 

Literatura 

  1. http://www.netlib.org/blas/ 

  1. http://www.netlib.org/blas/blast-forum/ 

  1. https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms, posjećena 05.12.2021. godine 

  1. https://dl.acm.org/doi/10.1145/355841.355847 

  1. https://www.netlib.org/lapack/explore-html/ 

  1. https://www.netlib.org/blas/faq.html 

  1. http://www.openblas.net/ 

  1. http://www.netlib.org/lapack/ 

  1. https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html#gs. ic9d1d 

  1. https://numpy.org/doc/stable/user/whatisnumpy.html 

  1. https://numpy.org/install/ 

  1. https://markus-beuckelmann.de/blog/boosting-numpy-blas.html 

  1. https://medium.com/datathings/benchmarking-blas-libraries-b57fb1c6dc7