17.1 BLAS

BLAS egy angol mozaikszó: Basic Linear Algebra Subroutines. (=Alapvetõ Lineráis Algebrai Segédprogramok) Ahogy már a névbõl is sejthetjük, ez különféle segédprogramokat tartalmaz alapvetõ vektor és mátrixmûveletekhez. A BLAS-ból építették föl a bonyolultabb kódrendszereket is, mint például a LAPACK-ot. A BLAS és annak forráskódja a Netliben keresztül hozzáférhetõ. Sok számítógépkereskedõnek már egy a saját gépükre optimizált, feltunningolt verziója van. Ez az egyik fõ elõnye a BLAS-nak: minden verziója kompatibilis a másikkal, tehát a BLAS bármilyen olyan gépen müködik, ahova egyszer már telepítették. A BLAS (és továbbfejlesztése: a LAPACK) egy egyszerüen kezelhetõ, kombatibilis, de egyben magas szinvonalú program, mely fõleg (de nemcsak) a lineáris algebrai számításokat könnyíti meg.

Szintek és elnevezési szokások

A BLAS segédprogramjai 3 szint (level) szerint osztályozhatóak: Minden egyes BLAS és LAPACK subroutinenak vannak további verziói, például megkülönböztetjük ezeket a számolt adat típusa szerint is. A segédprogram nevének elsõ betûje erre utal:
      S      Valós
      D      Pontosabb valós 
      C      Komplex 
      Z      Pontosabb komplex
A double precision-os (pontosabb) komplex nincs egyértelmûen definálva a Fortran 77-ben, de a legtöbb fordító elfogadja az alábbi deklarációt:
      double complex változók listája
      complex*16     változók listája

BLAS 1

Néhány eleme a BLAS 1 segédprogram családnak: Az elsõ betû (x) lehet akár S,D,C,Z is, ez a pontosságtól függ. Egy gyors (angol nyelvû) leírás található az alábbi címen: http://www.netlib.org/blas/blasqr.ps

BLAS 2

Néhány eleme a BLAS 2 segédprogram családnak: További részleteket a BLAS 2-rõl ezen a helyen találunk: http://www.netlib.org/blas/blas2-paper.ps. (ez is angolul van)

BLAS 3

Néhány eleme a BLAS 3 segédprogram családnak: A magasabb szintû mátrix operátorokat, mint például magasabb rendû lineáris egyenletrendszerek megoldása, csak a LAPACK-ban találunk. További információkért ide érdemes kattintanunk: http://www.netlib.org/blas/blas3-paper.ps. (angol nyelvû)

Példák

Elõször nézzünk egy egyszerû BLAS segédprogramot, az SSCAL-t

A subroutin meghivása az alábbi:

      call SSCAL ( n, a, x, incx )
ahol x egy vector, n a vektor hosszúsága (x azon elemeinek száma, amit használni kivánunk). Az incx jelöli a növekményt. Általában az incx=1, ekkor visszakapjuk az eredeti egydimenziós x vektorunkat. Ha incx>1, akkor a kifejezés azt jelenti, hogy mennyit kell ugranunk az x vektor egyes elemei között.Például ha incx=2 , akkor ezt azt jelenti hogy csak minden második elemét kell a vektornak nyújtani (tehát a vektor dimenziójának minimum 2n-1 - nek kell lennie). Ezek ismeretében nézzük az alábbi példát, ahol x -et valós real x(100)alakban deklaráltuk.
      call SSCAL(100, a, x, 1)
      call SSCAL( 50, a, x(50), 1)
      call SSCAL( 50, a, x(2), 2)
Az elsõ sor mind a 100 elemet szorozza a-val. A második sorban már csak az utolsó 50 elemét nyújtja meg a-val. A harmadik sorban lévõ pedig a páros indexû elemeket szorozza.

Fontos tudni, hogy ezzel az utasítással x-et felülírjuk az új értékekkel. Ha szükségünk van az eredeti x-re, másolatot kell róla készítenünk, a SCOPY használatával.

Most tekintsünk egy bonyolultabb esetet is. Tegyük fel, hogy van 2 db kétdimenziós tömbünk (mátrixunk) : A és B. A feladat az A*B szorzás eredményének megadása. A megoldás az, hogy kiszámoljuk A i sorának elemeinek és B j oszlopának elemeinek szorzatát, majd összeadjuk. Erre használhatjuk a BLAS1 segédprogramját az SDOT-ot. A nehézség a helyes indexezésben és a növekményben rejlik. Az SDOT formulizmusa az alábbi:

      SDOT ( n, x, incx, y, incy )
Tegyük föl, hogy a tömböket az alábbi módon definiáltuk:
      real A(lda,lda)
      real B(ldb,ldb)
de a programban az A aktuális mérete m*p, míg B-é p*n. A ideik sora az A(i,1) elemmel kezdõdik. De tudjuk, hogy a Fortran oszlop szerint számol, tehát a következõ A(i,2) elemet lda-ban tárolja átmenetileg (mivel lda az oszlop hosszúság). Ezért incx = lda beállítást alkalmazzuk. B oszlopainál nem áll fent ez a probléma, tehát itt incy = 1. A belsõ produktum hossza p. Tehát a korrekt válasz ez:
      SDOT ( p, A(i,1), lda, B(1,j), 1 )

Hol szerezzük be a BLAS-t?

Elõszõr nézzük meg, hátha van a számítógépünkön BLAS. Ha nincs, akkor itt megtalálhatjuk: http://www.netlib.org/blas.

Dokumentációk

A BLAS subroutine-ok szinte majdnem teljesen maguktól értetõdõek.. Ha tudjuk, hogy melyik routinra van szükségünk, megkeressük és elolvassuk a hozzá tartalmazó leírást, ahol a bemenet és kimenet paraméterek használatát részletesen ismertetik. Majd mi is nézünk erre egy példát a következõ fejezetben, ahol is a LAPACK segédpogramokról lesz szó.

 

Copyright © 1995-7 by Stanford University. All rights reserved.

Fordították: Seres András Tamás és Szalai Szilvia (ELTE-TTK)


[Tovább] [Tartalomjegyzék]