Šta je BLAS? 

Istorijski BLAS (Basic Linear Algebra Subprograms) ili danas BLAST (BLAS Technical Forum Standard) predstavlja specifikaciju skupa elementarnih funkcija (programskih rutina) za izvršavanje različitih matematičkih operacija u sklopu linearne algebre, i kao takav predstavlja standard za pisanje visoko optimizovanih biblioteka za različite tipove računarskih arhitektura. Pojavio se kao potreba da se određen skup matematičkih funkcija (operatora) standardizuje na neki način, kako bi se njihova upotreba mogla generalizovati na veći skup aplikacija [1].

Inicijalno je primjećeno da se u procesu programskog rješavanja većine zadataka linearne algebre, kao što su rješavanje sistema linearnih jednačina, metod najmanjih kvadrata, određivanje sopstvenih vrijednosti i sopstvenih vektora matrice, QR, LU ili SVD (singular value decomposition) dekompozicija matrice, najčešće pojavljuju jednostavne skalarne, vektorske i matrične operacije čija implementacija ujedno postaje najkritičniji dio u pogledu vremena izvršavanja [2]. Stoga je ideja ovog standarda i bila da definiše skup elementarnih matematičkih funkcija, kao i odgovarajući interfejs za njihovo pisanje, kako bi se one kasnije mogle iskoristiti za pisanje visoko optimizovanog univerzalnog koda, koji ne bi zavisio od implementacije samih low-level funkcija, niti od hardverske platforme na kojoj se izvršava. Iz tog razloga su danas većina standardizovanih state-of-the-art biblioteka za numerička izračunavanja u potpunosti realizovane da budu kompatibilne sa standardom koji je uveo BLAS. Neke od njih su: LAPACK, MATLAB, Numpy, Mathematica, Octave i druge [3].

Struktura funkcija u okviru BLAS biblioteke 

Sve funkcije u okviru BLAS standarda su podijeljene u tri karakteristične grupe, i to:

  • Level 1 - operacije nad skalarima i vektorima, 

  • Level 2 - operacije nad vektorima i matricama, 

  • Level 3 - operacije nad matricama. 

Iako se da zaključiti da je podjela funkcija izvršena na osnovu tipova operanada koji učestvuju u izvršavanju operacija, kao i složenosti samog algoritma (pod složenošću se ovdje podrazumijeva O()  mjera), ona takođe odgovara i nekom hronološkom razvoju ovog standarda. U nastavku ćemo reći par riječi o svakoj od ovih potkategorija.

Level 1 BLAS 

Ovaj skup funkcija čine svi potprogrami izloženi u originalnom BLAS radu 1979. godine [4], i sastoji se samo od, možemo reći, operacija nad skalarima i vektorima, kao što su računanje norme vektora, računanje skalarnog proizvoda vektora, računanje generalizovane vektorske sume u obliku y <- αx + y (gdje su parametri x i y vektori, a α je skalar). Takođe, funkcije omogućavaju rad sa različitim tipovima podataka (shodno tome i prvo slovo u nazivu funkcije definiše koji je tip operanada), a mogući tipovi podataka su:

  • Single (oznaka S) - realni podaci (npr. SSCAL - skalira vektor odgovarajućim skalarom), 

  • Double precision (oznaka D) - realni podaci sa dvostrukom preciznošću (npr. DSCAL), 

  • Complex (oznaka C) - kompleksni podaci (npr. CSCAL), 

  • Double Complex (oznaka Z) - complex*16 podaci (npr. ZSCAL). 

Pregled svih funkcija, kao i kratka objašnjenja u koju svrhu se koriste, se mogu pronaći na [1], dok se više informacija o svakoj funkciji, načinu njihovog korištenja, te tipovima argumenata, mogu pronaći na [5]. Na samom kraju napomenimo da je složenost ovih algoritama O(n), gdje n predstavlja broj elemenata vektora. 

Level 2 BLAS 

Level 2 BLAS skup funkcija se sastoji od potprograma koji realizuju operacije kod kojih je jedan operand vektor, a drugi matrica. Najčešće korištene operacije iz ove grupe funkcija su generalizovano množenje vektora i matrice u obliku y <- αAx + βy (gdje su α i β skalari, x i y vektori, a A matrica), te rješavanje sistema linearnih jednačina u obliku Ax = y. Podržavaju rad sa različitim vrstama matrica, kao što su trougaone, simetrične, ermitske i dijagonalne matrice višeg reda (banded matrix), te PS (packed storage) matrice. Takođe implementiraju rad sa svim tipovima podataka pomenutim u tekstu iznad. Uključene su u standard 1988. godine, sa ciljem da se poboljšaju performanse izvršavanja programa, baziranih na BLAS-u, na vektorizovanim procesorima. Kompleksnost ovih rutina je O(n^2).

Level 3 BLAS 

Level 3 BLAS skup funkcija se sastoji od potprograma koji realizuju operacije kod kojih su oba operanda matrice, i kao takav se pojavio poslednji u standardu početkom devedesetih godina prošlog vijeka. Najčešće korištena funkcija iz ove grupe je generalizovano množenje matrica u obliku C <- αAB + βC (gdje su parametri α i β skalari, a A, B i C su matrice) ili GEMM funkcija. Podržavaju rad sa različitim vrstama matrica, kao što su trougaone, simetrične, ermitske i dijagonalne matrice, te rad sa sva četiri tipa podataka. Složenost ovih algoritama je O(n^3).

Najčešće korištene realizacije BLAS biblioteke 

Reference BLAS biblioteka 

Osnovna realizacija BLAS biblioteke, koja je pratila definisanje standarda, je dostupna na [1] i nosi naziv Reference BLAS biblioteka. Takođe, na pomenutom sajtu je moguće pronaći i ostale informacije vezane za samu biblioteku, kao što su implementirane funkcije, njihova imena, način korištenja, kod, kao i način instaliranja biblioteke i sl. Biblioteka je napisana u Fortran77 programskom jeziku, ali su njene funkcionalnosti dostupne i u C programskom jeziku kroz CBLAS biblioteku, koja predstavlja C interfejs oko Fortran BLAS realizacije, i definiše wrapper-e odgovarajućih Fortran-ovih funkcija. Iako biblioteka ispunjava sve osobine definisane standardom, te iako je open-source, važno je napomenuti da njena realizacije nije u potpunosti optimizovana, te se s ciljem ostvarivanja odgovarajućih performansi, savjetuje korištenje dostupnih biblioteka optimizovanih za konkretnu hardversku arhitekturu.  Danas, ovo ne predstavlja veliki problem, jer većina proizvođača hardverskih komponenti posjeduje tim koji paralelno vrši realizaciju i nadogradnju vlastite BLAS biblioteke, tako da za  većinu dostupnih i često korištenih hardverskih arhitektura postoji BLAS realizacija optimizovana za konkretnu arhitekturu. Neke od najpoznatijih BLAS realizacija su:

  • MKL - INTEL realizacija math biblioteke, 

  • ACCELERATE - Apple realizacija math biblioteke, 

  • ARMPL – math biblioteka optimizovana za ARM procesore, 

  • ESSL - IBM visoko optimizovana math biblioteka... 

Opširnija lista komercijalnih realizacija BLAS biblioteke, kao i linkovi na iste se može pronaći na [1, 3, 6].

Takođe, važno je napomenuti da svaka od prethodno pomenutih biblioteka, pored funkcija definisanih u BLAS standardu, posjeduje i širok spektar složenijih matematičkih funkcija (npr. SVD, Cholesky ili QR faktorizacija i sl.), koje su bazirane na primjeni elemetarnih BLAS funkcija, te se kao takve mogu koristiti bez potrebe za poznavanjem njihove implementacije.

Pored realizacija namijenjenih za konkretne hardverske arhitekture, postoje i realizacije koje su nezavisne od samih arhitektura, a implementiraju prilično optimizovan kod. Najpoznatije realizacije ovog tipa su: 

  • OpenBLAS, 

  • ATLAS, 

  • BLIS... 

Na osnovu svega rečenog se može reći da se danas Reference BLAS koristi gotovo samo u slučajevima provjere da li pisani kod podliježe BLAS standardu, dok se u procesu testiranja i distribucije koda najčešće koriste visokooptimizovane komercijalne biblioteke, ili pak optimizovane open-source biblioteke. 

OpenBLAS biblioteka 

OpenBLAS biblioteka predstavlja univerzalnu open-source realizaciju BLAS biblioteke u okviru koje su implementirani algoritmi optimizovani za različite tipove procesora. Ima mogućnost da joj se u procesu prevođenja definišu karakteristike arhitekture korištenjem odgovarajućih flag-ova, ili pak da automatski detektuje karakteristike aritekture na kojoj se kompajlira, te da izvrši optimizaciju koda shodno detektovanoj arhitekturi. Iako nije u potpunosti optimizovana za konkretan procesor, te ne koristi u potpunosti njegove mogućnosti, pokazuje se da performanse dobijene primjenom ove biblioteke ne odstupaju mnogo od performansi koje se postižu korištenjem  biblioteka pisanih za konkretnu platformu, npr. MKL [7]. U dijelu Rezultati ćemo vidjeti da je ovo ustvari i tačno jer npr. MKL na Intelovom procesoru daje bolje rezultate u odnosu na OpenBLAS za samo nekoliko procenata. Ovo predstavlja jedan od osnovnih razloga zbog kojih je OpenBLAS gotovo u potpunosti potisnuo korištenje Reference BLAS biblioteke u svim fazama kreiranja koda, pa čak i u procesu razvoja koda.   

MKL biblioteka 

Intel oneAPI MKL (Math Kernel Library) predstavlja nadskup BLAS biblioteke pisane i optimizovane konkretno za Intel procesore. Pored samih funkcionalnosti koje implementira BLAS, u okviru nje su implementirane i operacije definisane u LAPACK biblioteci (Linear Algebra PACKage [8]), FFT algoritmi, rad sa sparse matricama, RNG (Rangom Number Generators) i druge funkcionalnosti. Više informacija o samoj biblioteci se mogu pronaći na [9]. 

Nastavak 

Testiranje BLAS biblioteke. 

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